このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

execコマンドで外部サーバのスクリプトを実行させたい

発言者:bis
( Date Wednesday, January 26, 2000 20:31:41 )


初心者の質問ですみません。
どなたか教えて下さい。

cgi/ssiが禁止されているサーバ(www.xxx.com)から
cgi/ssiが許可されているサーバ(www.yyy.com)のパールスクリプト(test.pl)
を実行させたいのですが、

www.xxx.comに置いてあるhtmlに

<!--#exec cmd="http://www.yyy.com/cgi-bin/test.pl"-->

とフルパスで記述し、www.yyy.comのtest.plを呼び出してもスクリプトは
実行されません。


execコマンドは、フルパスで記述してもダメなのですか?
また、パールを呼び出す為のhtmlとパールのファイルが別のサーバに
ある場合、どのように記述すればよいのでしょうか?

どなたかご教授願えませんでしょうか。よろしくお願い致します。

田中求之 さんからのコメント
( Wednesday, January 26, 2000 21:47:12 )

exec コマンドは、CGI を直接起動するコマンドですから、無理でしょう。

include のような、ネット経由で別のコンテンツを読み込んだりできる
コマンドを使う必要がありますね。 SSI に include ってないんでしたっけ?

Weasel さんからのコメント
( Thursday, January 27, 2000 10:43:34 )

このサーバーがUnix系であると仮定して、話を進めます。

> www.xxx.comに置いてあるhtmlに
> <!--#exec cmd="http://www.yyy.com/cgi-bin/test.pl"-->
> とフルパスで記述し、www.yyy.comのtest.plを呼び出してもスクリプト
> は実行されません。

www.xxx.comがCGI/SSIの利用を禁止しているのであれば、execコマンドは
実行できません。execコマンドが実行できない以上、例えCGIが別の
サーバーにあっても、それを起動することはできないと思います。

> include のような、ネット経由で別のコンテンツを読み込んだりできる
> コマンドを使う必要がありますね。 SSI に include ってないんでしたっけ?

SSIにincludeコマンドはありますが、SSIが使えないのであれば利用できない
と思います。

私がよく使う方法として、SSIの代わりに<img src>を利用します。
HTMLの適当な場所に
<img src="http://www.yyy.com/cgi-bin/test.pl">
というタグを埋め込み、test.plの一番最後に

print "Location: http://www.yyy.com/zzz.gif\n\n";

を追加して、適当な画像ファイルを出力します。


もしMac系のサーバーで、話が全然違ったらごめんなさい。

#早くMacサーバを構築したいな〜。

bis さんからのコメント
( Thursday, January 27, 2000 13:53:04 )

田中様、Weasel様、コメントありがとうございます。

サーバはUNIX系です。

> 私がよく使う方法として、SSIの代わりに<img src>を利用します。
> HTMLの適当な場所に
> <img src="http://www.yyy.com/cgi-bin/test.pl">
> というタグを埋め込み、test.plの一番最後に
> 
> print "Location: http://www.yyy.com/zzz.gif\n\n";
> 
> を追加して、適当な画像ファイルを出力します。

上記の方法を試してみましたが、動きませんでした。
test.plはアクセスログを取得するスクリプトで
アクセス日時、ブラウザ、ホスト、リンク元などを
記録しcsv形式のログを生成します。

<img src>を使っているのを見たことがありますが
これはカウンタでよくありますよね。

アクセスログの場合はダメなのでしょうか。
それとも私のやり方がまずかったのでしょうか。


> print "Location: http://www.yyy.com/zzz.gif\n\n";

ここがいまいち分からなかったのですが、
ただ単純にtest.plの最後の行に、この一文を記述しただけ
なのですが・・・
もちろんURLのパスは実在するものを書きました。

はぁ… 解決する何かよい方法はないでしょうか?
 よろしくお願い致します。

Weasel さんからのコメント
( Thursday, January 27, 2000 23:40:19 )

> アクセスログの場合はダメなのでしょうか。
それはないと思いますが、、、


下記のことをご確認願います。

1 CGIは問題なく動作しますか?
  (Perlのデバックは行いましたか?)
2 www.yyy.comでSSIから、このCGIを呼び出した
  場合は問題なく動作しましたか?
3 サーバーの設定で、拡張子の制限はありませんか?
  (私のLinuxサーバーでは拡張子を.cgiにしないと動作しません)
4 動作しないということは、どのようなことですか?
  (エラーメッセージなどは表示されましたか?
   ログには、どんなことが記録されましたか?)
5 Perlの構文は正しいですか?
  (subなどでコマンドを定義している場合には、
   一番最後にprint "Location: http://www.yyy.com/zzz.gif\n\n";
   と記入しても動作しないかもしれません)

以上の点で問題なければ、私が間違ったアドバイスをしてしまった
可能性があります。識者の方のご助力をお願いいたします。

どうしても動作しない場合には、フレームを使ってURLを隠すという
手段が残されていますが、、、

bis さんからのコメント
( Friday, January 28, 2000 12:20:10 )

Weasel様ありがとうございます。

> 下記のことをご確認願います。
> 
> 1 CGIは問題なく動作しますか?
>   (Perlのデバックは行いましたか?)

初心者のものでデバックの仕方が分かりません。
ですから行っていません。今後、勉強しようと思っております。


> 2 www.yyy.comでSSIから、このCGIを呼び出した
>   場合は問題なく動作しましたか?

はい、動作します。


> 3 サーバーの設定で、拡張子の制限はありませんか?
>   (私のLinuxサーバーでは拡張子を.cgiにしないと動作しません)

.htaccessのことでしょうか?
.htaccessには
AddType application/x-httpd-cgi .cgi
AddType application/x-httpd-cgi .pl
を記述しており、cgi,plのどちらでもcgiとして扱うという設定だと
認識しているのですが…



> 4 動作しないということは、どのようなことですか?
>   (エラーメッセージなどは表示されましたか?
>    ログには、どんなことが記録されましたか?)


エラーメッセージは表示されません。

www.yyy.comのhtmlからwww.yyy.comのtest.plを呼び出した場合、
アクセスログが生成される(パールスクリプトが実行されたから)
のですが、
www.xxx.comのhtmlからwww.yyy.comのtest.plを呼び出した場合、
ログが生成されません。
ですから、パールスクリプトが実行されていないと思います。


> 5 Perlの構文は正しいですか?
>   (subなどでコマンドを定義している場合には、
>    一番最後にprint "Location: http://www.yyy.com/zzz.gif\n\n";
>    と記入しても動作しないかもしれません)


ずぶの素人で申し訳ありません。
構文の知識はまったく皆無です。
今回のアクセスログ取得スクリプトはネットサーフレスキュー[web裏技]さん
のアクセス解析2(SSI式)を使用しています。
http://www.rescue.ne.jp/cgi-rescue/cgi?webaxs2ssi


やはり自分自身がバージョンアップしなければならないようです。
もう少し勉強しようと思います。

Weasel様、いろいろ教えて頂き本当にありがとうございました。
感謝しております。

Weasel さんからのコメント
( Friday, January 28, 2000 23:01:27 )

> 今回のアクセスログ取得スクリプトはネットサーフレスキュー[web裏技]さん
> のアクセス解析2(SSI式)を使用しています。
> http://www.rescue.ne.jp/cgi-rescue/cgi?webaxs2ssi

ソース見てみました。ちょっと今は時間がないので、細かい検証は
出来ないのですが、一番最後の行に
exit;
というコマンドがあったのが気になります。

もしかしたら、このコマンドの前に
print "Location: http://www.yyy.com/zzz.gif\n\n";
を入れると動くかもしれません。

それか、SSIでCGIを呼び出す形式(post or get)と<img src>
で呼び出す形式が違うかもしれません。

今週末は、アクセスログのCGIを制作する予定だったので、
ちょっと調べてみることにします。

bis さんからのコメント
( Saturday, January 29, 2000 13:13:48 )

> exit;
> というコマンドがあったのが気になります。
> 
> もしかしたら、このコマンドの前に
> print "Location: http://www.yyy.com/zzz.gif\n\n";
> を入れると動くかもしれません。

exit;の前に記述してみました。しかし、ダメでした。


> 今週末は、アクセスログのCGIを制作する予定だったので、
> ちょっと調べてみることにします。

もし、何かわかりましたらポストして頂けませんでしょうか?


TAIRA さんからのコメント
( Sunday, January 30, 2000 23:03:59 )

はじめまして
私も同じような経験があります。
ちょっと的外れな意見だったらごめんなさい。

私の場合レンタルサーバーで、バーチャルドメインを取得しているのですが
ログ生成は、ポップアカウントを指定してやれば動いてくれてます。
zzzがアカウント名だとしたら
<img src="http://www.yyy.com/~zzz/cgi-bin/test.pl">
としています。

Weasel さんからのコメント
( Sunday, January 30, 2000 23:25:19 )

週末、個人的な用件でアクセスログのCGIをつくっていました。
その最後の行にprint locationのコマンドをいれましたが、
問題なく動作しました。

#ただし、アクセスログが書き込まれないというバグが
#あって、その対処に追われていましたが、、、

bisさん、下記のことをご確認願います。

1 さきほどあげたprint locationだけのCGIをつくって
  サーバーにアップして、動作を確認してください。
  (ブラウザーにURLを入力して、アクセスしてください)

2 問題なく動作したら、その URLを<img src>で指定
  した別のHTMLを開いてみてください。

上記で問題なく動作するのであれば、あとはアクセスログの
CGIの問題だと思います。
ソースはちらっと見ましたが、細かく検証する暇がありません
でした。
一番てっとり早いのは、作者に直接問い合わせることだと
思いますが、、、

bis さんからのコメント
( Tuesday, February 01, 2000 17:05:29 )

TAIRA様、コメントありがとうごいます。

> zzzがアカウント名だとしたら
> <img src="http://www.yyy.com/~zzz/cgi-bin/test.pl">
> としています。

使用しているサーバはレンタルではなく、専用で使用しています。
そのためポップアカウントでディレクトリを分けているずはないと
思います。
私はあまり詳しくないので、推測で申し訳ありませんが、
レンタル等で複数人が共有して使用する場合、このポップアカウント[~]
でディレクトリを切るのですよね?
ですから、プロバイダで提供されるアカウントに相当するディレクトリ
がありません。
便乗質問で申し訳ありませんが、ポップアカウントとはどのようなものなの
でしょうか?


> 1 さきほどあげたprint locationだけのCGIをつくって
>   サーバーにアップして、動作を確認してください。
>   (ブラウザーにURLを入力して、アクセスしてください)

うまく表示されました!

 
> 2 問題なく動作したら、その URLを<img src>で指定
>  した別のHTMLを開いてみてください。

こちらもうまく表示されました。

ということは、cgiの問題ということですね。
もう少し勉強して出直して来ます。
Weasel様、いろいろと親切に教えて頂き本当にありがとうございました。
感謝しております。


Weasel さんからのコメント
( Tuesday, February 01, 2000 21:16:22 )

> 便乗質問で申し訳ありませんが、ポップアカウントとはどのようなものなの
> でしょうか?

POPアカウント=メールアカウントと考えても差し支えないと思います。
プロバイダにもよりますが、多くのプロバイダの場合、ユーザーディレクトリ
名とメールアカウント名が同じです。
ユーザーディレクトリとはユーザーが自由に利用できるサーバースペースの
事で、このディレクトリに自分のHTMLデータをおいたり、メールデータを
受信したり、などと利用します。

http://www.yyy.com/~zzz/cgi-bin/test.pl
の場合、ユーザーディレクトリにあるcgi-binディレクトリのtest.plを
起動させるということになります。

ただし、今回のケースではあまり関係がないのではないかと思います。


> Weasel様、いろいろと親切に教えて頂き本当にありがとうございました。

私としては、解決案を提案出来なかったことをお詫び申し上げます。
早く田中先生みたいに、的確なアドバイスができるようになりたいです。

おがわ まこと さんからのコメント
( Wednesday, February 02, 2000 00:30:25 )

> 今回のアクセスログ取得スクリプトはネットサーフレスキュー[web裏技]さん
> のアクセス解析2(SSI式)を使用しています。
> http://www.rescue.ne.jp/cgi-rescue/cgi?webaxs2ssi
とのことなのですが

そのソースファイルの中の
> #ログファイルの場所をSSI記述するHTMLから見たパスを設定
> $base_dir = "./log/";
このあたりあやしいような気がします.