プロが教えるわが家の防犯対策術!

URL付のcgi を動かすにはどうしたらいいのでしょう。
つまり2つの独立したサーバーがあり、お互いに
呼び出して実行したい場合、同一サーバーなら通常、

$test= 'home/public_html/cgi/test.cgi';
open (test);
print while <test>;

ちょっとまどろっこしいんですが、このように実行
できるかと思うんです。
しかし、別のサーバーにあるとこうはかけません。
したがって1行目を

$test= 'http://test.com/cgi/test.cgi';

・・・と書きたいところなのですが、どうもうまく
実行されないようです。
何かいい解決策があれば教えてください。

A 回答 (3件)

http: のスキームから始まるものは、当然プログラムという解釈ではないです。


HTTPというプロトコルを利用して、"ハイパー(Hyper)テキスト(Text)を転送(Transfer)する通信規約(Protocol)"なわけですから、そのサーバ上でプログラムが実行・解釈されて、そこからハイパーテキストを転送するだけです。
変数にそのプロトコルを利用するものを代入して、openしたって、Perlがそのプロトコルの手続きを代行してくれるものではありません。

「他のサーバのCGIを実行して、そこから排出されるハイパーテキストを取得したい」という事であれば、Socketモジュールでポート80番(http)への手続きを自分で行うか、LWPなどのモジュールを使用する必要があります。

恐らくLWP::Simpleを使用するのが一番簡単なので、

-----
use LWP::Simple;
$test= 'http://test.com/cgi/test.cgi';
getprint($test);
-----

で、恐らくご希望の動作が行えるはずです。
尚、LWP::Simpleは標準で使用出来るモジュールではないのでモジュールをインストールする必要があります。
(参考URLはLWPモジュールのダウンロード元)

Perl標準のSocketモジュールを使用する場合は

-----
use Socket;
my $test = 'http://master/';
my($host, $cgi) = ($test =~ m{^http://(.+?)(/.+)$});
my $osock =
sockaddr_in(scalar(getservbyname('http', 'tcp')),
scalar(gethostbyname($host)));

$| = 1;
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
connect(SOCK, $osock);
send(SOCK, "GET $cgi HTTP/1.0\n\n", 0);
my $flag = 0;
while(<SOCK>){
$flag = 1 if /^[\r\n]+$/;
next unless $flag;
print;
}
close SOCK;
-----

こうすれば恐らく可能です(テストしていません)
ちなみに、

>$test= 'home/public_html/cgi/test.cgi';
>open (test);
>print while <test>;

では動かないはずです。

$test= 'home/public_html/cgi/test.cgi';
open (test, "$test |");
print while <test>;

なら動くとは思いますが…。

参考URL:http://search.cpan.org/search?dist=LWP5emu
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
大変詳細かつ、明確な説明感謝いたします。
このスクリプトを穴のあくほど十分に参考にさせて
いただきます。m(__)m

お礼日時:2002/02/18 19:36

すみません。

No.2のnipotanです。
回答後にコードを読んでいて間違いに気付いたので補足です…。

Socketを使う場合のコードにミスがありました。

>socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

という行は、正確には
socket(SOCK, PF_INET, SOCK_STREAM, scalar(getprotobyname('tcp')));
としないとダメかも知れません。

ちなみに、
>my $test = 'http://master/';
というのは、私の手元の環境で/etc/hostsに加えているローカルコンテンツのURLを書いてしまいました ^^;
$testという変数に、実行したいCGIのabsolute URIを代入すればOKです。
(テストしてみました)
    • good
    • 0
この回答へのお礼

Socket の方法と両方試してみたのですが、LWP::Simple
の方法であっさり動いたので、感激しました。
いい感じです。ありがとうございました!!!

お礼日時:2002/02/19 15:15

他サイトのCGIの呼び出しは,HTTP経由で行わなくてはなりません。


(そうでなくてはセキュリティ上問題がありすぎる)
逆にいえば,HTTP経由であれば可能ですが,そのためにはPerlからHTTPが扱えなくてはなりません。

その方法としては,

A)自分でプロセス間通信のプログラムを書く
B)どこかからHTTP通信を行うPerlモジュールを探しだしてくる

が考えられます。

A)については,Perlにはプロセス間通信のAPIが備わっているので,それを使えば良いでしょう。
B)については,どこかにはあると思いますが,私は知らないので,ご自分で探してみてください。

いずれにせよ,CGIがHTTPを経由してどのように動作するのかを理解している必要がありますので,まずHTTPやCGIの仕組みについて理解することをおすすめします(参考URLにいくつかそれらしいものを挙げておきましたが,これだけではたぶん不充分だと思います)。

参考URL:http://www.atmarkit.co.jp/fnetwork/rensai/netpro … http://www5a.biglobe.ne.jp/~n_rieko/cgi/init.htm
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
今朝になってもどなたからも回答がないので、多少
へこんでいたところでした。
しかもHTTP経由で行なうとは思いつきませんでした。
参考URLを十分に参考にさせていただきます。m(__)m

お礼日時:2002/02/18 19:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!