URL付のcgi を動かすにはどうしたらいいのでしょう。
つまり2つの独立したサーバーがあり、お互いに
呼び出して実行したい場合、同一サーバーなら通常、
$test= 'home/public_html/cgi/test.cgi';
open (test);
print while <test>;
ちょっとまどろっこしいんですが、このように実行
できるかと思うんです。
しかし、別のサーバーにあるとこうはかけません。
したがって1行目を
$test= 'http://test.com/cgi/test.cgi';
・・・と書きたいところなのですが、どうもうまく
実行されないようです。
何かいい解決策があれば教えてください。
No.2ベストアンサー
- 回答日時:
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
回答ありがとうございます。
大変詳細かつ、明確な説明感謝いたします。
このスクリプトを穴のあくほど十分に参考にさせて
いただきます。m(__)m
No.3
- 回答日時:
すみません。
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です。
(テストしてみました)
Socket の方法と両方試してみたのですが、LWP::Simple
の方法であっさり動いたので、感激しました。
いい感じです。ありがとうございました!!!
No.1
- 回答日時:
他サイトの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
回答ありがとうございます。
今朝になってもどなたからも回答がないので、多少
へこんでいたところでした。
しかもHTTP経由で行なうとは思いつきませんでした。
参考URLを十分に参考にさせていただきます。m(__)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- Excel(エクセル) VBA ワークシート指定の1行目を選択をしたい 2 2022/08/20 18:10
- ドライブ・ストレージ HDDのチェック方法 6 2022/05/04 09:49
- CGI CGIで出力するhtmlの<!DOCTYPE html>等のタグは要りますか? 2 2023/02/05 21:26
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Java java final 1 2022/06/10 22:49
- システム ホームページの仕組みについて 3 2022/08/16 14:33
- Visual Basic(VBA) Excle VBA Findメソッドについて 3 2022/07/15 13:56
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jcode.plが読み込めない
-
cgiとplとpm
-
perlのrequireの動き方について...
-
cgiからcgiをコールする。
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
エクセルで毎月第2週日の水曜日...
-
クライアントのIPとマシン名を...
-
燃えるゴミの日は何曜日ですか?
-
apacheでPerl CGIが作動せず、5...
-
エクセルで相対パスの書き方を...
-
VBA。複数のChangeイベントをま...
-
Excelで第一〇曜日を求める方法...
-
指定曜日にMsgBox表示は可能で...
-
VBAでExcelのヘッダーに文字列+...
-
ユーザー定義の(aaa)
-
週休3日制で土日の他にもう一日...
-
6月の第2 第4火曜日は何日...
-
「曜日」の名前、変えるとしたら?
-
ftpでのネットワークバイトオー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cgiとplとpm
-
perlのrequireの動き方について...
-
jcode.plが読み込めない
-
自CGIのURLのパス部分を取得す...
-
Perlソースを2つのファイルに分...
-
Perlのデバッグ方法って。。。...
-
mt-check.cgiでForbiddenエラー...
-
webからroot権限のコマンドを実...
-
useとrequireでエラー
-
画像のURLの変数を別のCG...
-
Quantifier follows nothing in...
-
require文が実行できない
-
コマンドラインでGET or POSTで...
-
apacheのCGI設定について教えて...
-
Not Found 404エラー時のCGI出力
-
htmlからテキストを返すperlを...
-
perlのcgiで、変数の中身を表示...
-
use CGI
-
フォームでインクリメント入力→...
-
Internal Server Error
おすすめ情報