OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

www.URL 付のcgi を動かす

  • 困ってます
  • 質問No.219614
  • 閲覧数41
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 76% (155/202)

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

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

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

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

・・・と書きたいところなのですが、どうもうまく
実行されないようです。
何かいい解決策があれば教えてください。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル11

ベストアンサー率 59% (134/227)

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>;

なら動くとは思いますが…。
お礼コメント
naru

お礼率 76% (155/202)

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

その他の回答 (全2件)

  • 回答No.1
レベル11

ベストアンサー率 47% (160/334)

他サイトのCGIの呼び出しは,HTTP経由で行わなくてはなりません。 (そうでなくてはセキュリティ上問題がありすぎる) 逆にいえば,HTTP経由であれば可能ですが,そのためにはPerlからHTTPが扱えなくてはなりません。 その方法としては, A)自分でプロセス間通信のプログラムを書く B)どこかからHTTP通信を行うPerlモジュールを探しだしてくる が考えられます。 A) ...続きを読む
他サイトのCGIの呼び出しは,HTTP経由で行わなくてはなりません。
(そうでなくてはセキュリティ上問題がありすぎる)
逆にいえば,HTTP経由であれば可能ですが,そのためにはPerlからHTTPが扱えなくてはなりません。

その方法としては,

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

が考えられます。

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

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

お礼率 76% (155/202)

回答ありがとうございます。
今朝になってもどなたからも回答がないので、多少
へこんでいたところでした。
しかもHTTP経由で行なうとは思いつきませんでした。
参考URLを十分に参考にさせていただきます。m(__)m
投稿日時 - 2002-02-18 19:26:44
  • 回答No.3
レベル11

ベストアンサー率 59% (134/227)

すみません。No.2のnipotanです。 回答後にコードを読んでいて間違いに気付いたので補足です…。 Socketを使う場合のコードにミスがありました。 >socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')); という行は、正確には socket(SOCK, PF_INET, SOCK_STRE ...続きを読む
すみません。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です。
(テストしてみました)
お礼コメント
naru

お礼率 76% (155/202)

Socket の方法と両方試してみたのですが、LWP::Simple
の方法であっさり動いたので、感激しました。
いい感じです。ありがとうございました!!!
投稿日時 - 2002-02-19 15:15:03
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ