- ベストアンサー
CGIからCGIを、CGI環境変数付きで実行するには?
CGI(Perl)からCGI(Perl)を実行してその出力を得るには どうしたら良いでしょうか。 そのCGIがもっている環境変数(IPアドレスとか、POSTデータ)も 渡したいのですが・・・。 Openでパイプを使ってやればいいとまではわかり、 環境変数などを渡さないで純粋にCGIを実行させて その出力を受け取るところまでは出来ました。
- masapiyochan
- お礼率87% (183/209)
- Perl
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Openでパイプを使って起動した子プロセスには、環境変数は全てコピーされるはずです。 どの変数が消えたり変ったりしてますか? > 環境変数(IPアドレスとか、POSTデータ) CGIパラメーターが環境変数として渡されるのは GETメソッドの場合です。 (GETメソッドの場合、URL上でも xxxx?a=1&b=2 の様にパラメーターを表現できます) POSTメソッドの CGIパラメーターは、STDIN から入力します。 だから、これを子プロセスに引き継ぐには、それなりの工夫が必要です。 工夫というと、例えば以下のいずれかです。 ・ 親が STDIN を読む前に子プロセスを起動する。 ・ 親は入力した STDIN を記憶しておき、子プロセスの起動後に記憶内容をパイプで渡す。 子プロセスの STDOUT を親がパイプで読みたいなら、さらに面倒。 (パイプ指定の open() だけでは STDIN/STDOUT 両方のパイプは多分不可) いずれの場合も、CGI.pm なんかを親が使うとまずいかも知れません。
関連するQ&A
- cgi環境変数の変更方法?
cgi環境変数の変更方法? perlで書かれたcgiプログラムがあります。 そのcgiではcgi環境変数内のREMOTE_ADDRを読出し、特定のIPアドレス【特定の端末】であれば特別処理を行っております。 今回、別の端末【別のIPアドレス】から同じ特別処理をする必要が生じました。 サーバ側のcgiプログラムを修正すれば簡単なのですが、著作権上の問題があって出来ません。 そこで端末側のプログラムがC#のWebClientクラスを使用してサーバと交信しているのを幸いとして myClient.Headers.Set("REMOTE_ADDR", "xxx,xxx,xxx,xxx"); ← 従前のIPアドレスへの変更 のステートメントを追加して強制的にIPアドレスを変更しようとしました。 ところがサーバ側のcgi環境変数には、HTTP_REMOTE_ADDRという新しい要素が加わっただけであり、目的とするREMOTE_ADDRを修正出来ません。 調べてみると、apacheがHTTP_タグを追加しているとのことです。 この追加をやめさせREMOTE_ADDRに当方が望むIPアドレスを設定することは可能でしょうか?
- ベストアンサー
- C・C++・C#
- 外部CGIの実行結果を変数内に取り出したい
こんにちは。 外部CGIの以下のような実行結果を、プログラム内(変数)に読み込むにはどうしたらよいのでしょう。 簡単そうなのにできないので・・。 「Content-type: text/html 文章」 外部プログラムが吐く上記のような内容を、普通に変数内に読み込みたいのです。 しかしopenでは実行前の、cgiの中身がそのまま出てしまいますし、 systemやexecコマンドでは、実行結果の内容が、変数に格納される前に、そのまま出力されてしまいます。 外部cgiの方を変更するしかないのでしょうか? どなたかお教えください。
- ベストアンサー
- Perl
- 環境変数に文字列をセット?必須ヘッダ?
perlから環境変数にある文字列をセットしてcgiに送信するには、どのようにすればよいのですか? また、perlからcgiにデータを送る際、ヘッダはどのように書けばよいのでしょうか? 例えば、自分は(perl)はPOSTでContent-Typeはtext/plainだということをcgiに伝えるなど…。 また、ヘッダをcgiへ送る際、必須のヘッダは何があるのでしょうか? 初心者なので、くだらない質問ですいません。 よろしくお願いします。
- ベストアンサー
- Perl
- クライアントの環境変数値を得る。
よろしくお願いします。 web上からCGIを実行したときに そのCGIを実行したクライアントの環境変数値を得ることは可能でしょうか? システム環境変数の「HOME」や「TEMP」の指定先を得たいのですが。 クライアント端末はWindows2000 or XP です。 webサーバー・・・HP-UX web・・・IE CGI開発言語・・・Perl もしくは csh 開発端末・・・windows2000(Tera Term 使用)
- ベストアンサー
- CGI
- system で実行したプログラムの標準出力を変数で受け取りたい
実行結果を標準出力に出力する cプログラム A があります。 perl から system を利用して A 呼び出し、その実行結果を perl で加工する仕組みを考えています。 今のところ、標準出力を一旦変更して、テンポラリのファイルに出力させ、再度そのファイルをオープンして perl で利用するという形で何とか実現できています。 open (SAVESTDOUT, ">&STDOUT") or die "..."; #(1) open (STDOUT, ">$tempFile") or die "..."; #(2) system "A"; #(3) close(STDOUT) or die "..."; #(4) open(STDOUT, ">&SAVESTDOUT") or die "..."; #(5) という感じです。 一旦テンポラリーのファイルを介するところがスマートでないので、直接変数に標準出力結果を落したいです。 (1) そのまま (2) 標準出力を perl の変数に変更 (3) そのまま (4) なし (5) そのまま といった感じで実現したい(もちろんより良い解法があれば尚宜しいです)のですが、可能でしょうか? ご教授ください。宜しくお願いします。
- ベストアンサー
- Perl
- 特定CGI「だけ」が、ローカル環境で実行できない原因について。(POSTでのフォーム送信はローカル実行不可?)
こんばんは。 サーバでは問題なく動くCGI(Perl)が ローカルPC環境で動きません。 ローカルのHTMLファイルから呼び出すと CGIファイルがテキストとして表示されます。 しかし、パス関係の間違いはありません。 動かないCGIファイルを「print "Hello!";」などの 単純な文章に書き換え、同じHTMLから呼ぶと動きます。 また、「Perl文法チェックサイト」で チェックしても、文法間違いはありません。 ほかにどういった原因が考えられますでしょうか? ---------------------------------------- なお、ローカルのHTMLでは 「form」にラジオボタンを配置、 「submit」で「POST」送信したうえで その結果によってHTMLを生成出力するようにしています。 ここらへん、まったくよく分かっていないのですが もしかして、こういう送信はローカルでは 実行できないとかあるのでしょうか? 送信部分を削って、HTML出力だけのCGIにすると動きます。 繰り返しますがサーバ上では動作しています。 よろしくお願いいたします。 ---------------------------------------- ◆環境◆ WindowsXP IE6.01 httpd 1.42m ActivePerl(バージョンの見方が分かりません)
- ベストアンサー
- CGI
- CGI内からSSIを実行したいのですが・・・
趣味でPerlによるCGIをやっています。 CGI出力結果と他のページとでヘッダーを共通化したいのですが、CGIファイル内にSSIの#include fileなどを挿入することはできるのでしょうか。 CGIファイルの中に print "<!--#include file="sample.html"-->\n";とするとそのままソースに書きこまれて出力されるだけで実行されないんですけど、、、なにかうまい方法はないでしょうか、お願いします。
- ベストアンサー
- その他(プログラミング・開発)
- a.cgi経由で、b.cgi実行
a.cgiからLOCATIONで、b.cgiを実行したいのですが、 1つ条件がありまして、b.cgiを実行する場合は必ず a.cgi経由出なければいけないというチェックをしたいのです。 LOCATIONを使用した場合、環境変数「HTTP_REFERER」に値がセットされないみたいなのでNGでした。 またパラメータを持たせるにしても、LOCATIONはGETしか使えないので、アドレスを見ればばればれになってしまいNGです。 何かいい方法はないでしょうか? よろしくお願いします。
- ベストアンサー
- Perl
お礼
ありがとうございます。下のような感じでできました・・・。 open (IN, "perl C:\\test\\hoge.cgi|"); while ( $line = <IN>) { print $line; } close(IN); が・・・実をいえば、実現したいことは、 CGIでHTMLファイルを読み込んで、その中のSSIを解析し、それをCGI上で実現することなんです。 上のような方法で、 <!--#exec cmd="test.cgi" --> という記述をCGIで認識してそれを実行し出力することには成功しました。 また、環境変数もきちんと渡せていました。 しかし・・・例えば、test.cgi?a=bのようにパラメータをつけての実行はできませんでした。 一応、CGIからCGIを実行することには成功しましたので、 あらためて質問をたてさせていただきます。