• ベストアンサー

SSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません

SSI初心者の者です。 参考書(CGIプログラミング入門/翔泳社)を見ながらCGIとSSIの勉強をしてるのですが、SSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません。 本には前者はPerlスクリプトで後者はCGIスクリプトの場合に使うって書いてあるのですが、この2つってどう違うのですか? 前後の文脈から察するにCGIスクリプトは『print "Content-Type: text/html"』があって、 Perlスクリプトはこれが無いものと読み取れるのですが そうなのでしょうか? 初心者向けに御回答していただけますよう、よろしくお願いいたします。

  • CGI
  • 回答数3
  • ありがとう数6

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

  • ベストアンサー
  • hyde-la
  • ベストアンサー率28% (42/146)
回答No.3

補足受けましたhyde-laです 結論から言いますと、無視されるようなことはありません。 飽くまで「結果」をどう扱うかという話ですので。 この場合の結果とは、プログラムの標準出力へ出力されたものという意味です。 #EXEC CMDでは、プログラムの「標準出力」を結果としてブラウザに表示するだけです。 UNIXやDOS等、多くの環境には「標準出力」という考え方があります。 これはPRINT文などで出力される場所で、つまりデフォルトでは画面です。 (標準出力はリダイレクトという操作を用いて、出力先を変えることが出来ます)

redsky
質問者

お礼

再度、御回答いただき誠にありがとうございます。 実はその後、いろいろ試行錯誤を繰り返しまして 結論から言いますと、ファイルを読んだり書き込んだり するときには絶対パスを指定しなくてはならなかったの ですが、私は相対パスを指定していたのでうまくいかな かったということが判明いたしました。 hyde-la様、Tma様にはいろいろとアドバイスをいただき 本当に感謝しております。 ありがとうございました。

その他の回答 (2)

  • hyde-la
  • ベストアンサー率28% (42/146)
回答No.2

SSIは基本的に「コマンドを実行してその結果を返す」ためのものです。 ですから、 #exec cmdの場合だと「これはブラウザに結果を返しますよ」 という前提の下で結果が処理されますので、正常に出力されます。 しかし#exec cgiでは、既に「CGIとしてブラウザに結果を 返します」なので CGIの中でTmaさんのおっしゃるようにヘッダをPRINTしてやらないと 平常に出力されなくなってしまいます。 ですから、ちゃんとしたCGIを呼び出す時はCGI=""で。 CGI以外のコマンドで、代用のために呼び出すならCMD=""で。 実際にSSIを使える環境にあるなら、以下を試してみてください。 <!-- #exec cmd="ls" --> <!-- #exec cgi="ls" --> サーバー上のディレクトリ一覧が正常に表示されたのは どちらでしょうか? 仕様通りなら、上のものが正常に出力されるはずです。

redsky
質問者

お礼

お応えいただきありがとうございました。 Tmaさんの回答と併せてよく拝読しましたら より理解が深まりました。 ただ、ふと思うのですが、#exec cmdの場合は 『ブラウザに表示させる』ことを前提にしてるからには print や ls などの表示系のコマンドしか受け付け ないのでしょうか? たとえば、ファイル操作系の命令↓ open(IN,">name.txt"); print IN "T.Suzuki"; close(IN); は無視されてしまうのでしょうか? 私の持ってる本では訪問者カウンターを作るときに #exec cmdを使って上記の様なファイル操作の命令を 行ってるのでできそうな感じなのですが、実際私が 試してみたらできませんでした。 今のところ原因はわかりませんが、もしかしたら #exec cmdではファイル操作の命令はできないのだろう か?と思った次第です。でも、本にはできるって書いて あるし・・・。若干混乱してきてます。

  • Tma
  • ベストアンサー率48% (13/27)
回答No.1

後者の「#exex cgi」は CGI として起動することとですが 前者の「#exrc cmd」は command の cmd だったはずです。 なので exec cmd はそこからシェルスクリプトを起動できるのと exec cgi はそのスクリプトを起動するだけの違いだったと思います。 ただ、「print "Content-Type: text/html\n\n」は HTML のコンテントタイプを指定しているもので 前者の command ではシェルスクリプト起動であるため そのままの結果が表示されるので HTML コンテントタイプが不要で、 後者の CGI ではコンテントタイプを指定する必要があるからだと思います。 通常の CGI を Perl などで使ったことがあるのであれば わかるかと思いますが、CGI として起動したものを WWW ブラウザに HTML ファイルと教えるには "Content-Type: text/html\n\n"という記述が必要だと わかるかと思います。

redsky
質問者

お礼

お応えいただき、どうもありがとうございます。 UNIXもわからないのでシェルスクリプト といわれてもイマイチピンと来ないのですが、 cmdの場合はブラウザに結果を表示するために あり、cgiはブラウザに表示させることは 前提としていないから"Content-Type: text/html\n\n" が必要なんですね。 ありがとうございました。m(__)m

関連するQ&A

  • SSI で #exec 以外で Perl-CGI を実行する方法は?

    最近 CGI に興味をもち Perl を始めました。 簡単なサンプルを無料サーバーにアップロードして cgi だけを 直接実行すると問題なく実行されます。 ですが SSI の #exec を使って HTML ソースに <!--#exec cgi="/cgi-bin/sample.cgi" --> と記述してページを開くと [an error occurred while processing this directive] と表示されてエラーになりました。 無料サーバーは infoseek で CGI/SSI は使えると書かれていたので 試してみました。それでもう一度確認の為に読んで見ると『#exec』は セキュリティ強化のため利用できないことが判明しました。 http://help.www.infoseek.co.jp/isweb/20602.html#7 質問内容: (1)CGI/SSI は使えるが #exec は使えない状況でどうやって Perl-CGI を   HTML ソースに記述して実行すればよいのか? (2)CGI は cgi-bin に置きパーミッションを 755 に設定しています。   設定は infoseek さんの指示通りです。他に設定すべき点ありますか? (3)Perl-CGI の1行目ではちゃんと『#!/usr/local/bin/perl』と記述しています。   こちらも infoseek さんの指示通りです。   Perl の記述で何か気をつけるべき点はありますか?バグ以外で。 (4)HTML ソースの拡張子は shtml にしています。   SSI を使うにはサーバーが対応していれば拡張子を変えるだけで使えるのですか? 今回の質問は Perl-CGI を HTML ソースに記述して実行する?には どうすべきかをお聞きしたいです。infoseek さんの情報は次のリンクです。 http://help.www.infoseek.co.jp/isweb/20601.html またネット検索していたら次のページを発見しました。 http://cocohome.hp.infoseek.co.jp/ssi/ ここの人は私と同じ infoseek で SSI 入門を書いています。 なぜこの方は SSI の #exec が使えるのでしょうか? この辺も知りたいです。 分かる方お願いします。 教えて下さい。

    • ベストアンサー
    • CGI
  • Apache 2.0 で SSI cmdが動かない

    同じ質問で http://okwave.jp/qa/q451501.html これと同じですが、未だ解決していないようなので。先に上記を見て下さい。 SSI の機能は ファイルアクセス表示などのコマンドが実行できているので、動作しています。 <!--#exec cmd="test.cgi" --> でエラーログが下記です。 execution failure for parameter "cmd" to tag exec in file.......shtml cmdの実効に失敗した。 test.cgi はDOSのbat で動作、及びHTMLのhead等のタグをプリントで入れれば 正常動作しています。 先人の質問でやり取りは一通りやっています。LoadModule等も #exec cmd がどうしても機能しないと思えますが 宜しく御願いします。

    • 締切済み
    • CGI
  • Apache2.2でPerlを呼び出すSSIを使ったHTMLをloca

    Apache2.2でPerlを呼び出すSSIを使ったHTMLをlocalhostで動かそうとしています。 AddHandler cgi-script .cgi .plに変更。 exec cmdをHTMLファイルに埋め込みました。 <!--#exec cmd="/PROGRA~1/APACHE~1/Apache2.2/cgi-bin/counter.pl counter"--> インターネットのApacheでSSIを使う方法を読み,httpd.confの中に Options FollowSymLinks Multiviews の後にIncludesをつけ   AddType text/html .shtml と   AddHandler server-parsed .shtml を加えました。しかし、localhostで実行するとHTMLのSSIの部分だけ表示されません。 (アクセスカウンターのカウンターだけ表示されません)。エラーログには ”指定されたファイルが見つかりません。 : don't know how to spawn cmd child process: C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/counter.shtml” と記録されていました。 どうしたらよいのでしょうか。 どなたか解決できるかた、回答よろしくおねがいします。

    • 締切済み
    • CGI
  • 時間でリンクが変わるSSIとCGI

    お世話になります。よろしくお願い致します。 時間によって飛ぶリンク先を変えるCGIのスクリプトをSSIと組み合わせて考えていますが、頭が混乱しています。どなたか教えてくださいませ。 午前1時から午前5時までは違うページにしたいです。 <A href='<!--#exec cmd="jikan.cgi"-->' ><この時間の楽しいページ♪</A> というSSIを使ったリンクをSHTMLのページに作っておきます。exec cmdは使えます。 で、 jikan.cgiで、夜中はyonaka.htmlに飛ばせて、それ以外はhiru.htmlにリンクしたいです。 ちなみにyonaka.htmlは少しセクシーなページにしたいです(笑)。 yonaka.htmlには.htaccessでアクセス制限でリンク元からしか入れないようにする方法は知っています。つまり、前回yonaka.htmlに入った人がお気に入りに登録してもアクセスできないようにする方法は知っています。 jikan.cgiは、 $hour = (localtime(time))[2]; if ($hour > 1 && $hour < 5) { というよなあたりまでは良いでしょうか?…無知で恥ずかしいです(涙) あと少しとか思われるかも知れませんが、私には無限の彼方です(大涙) よろしくお願い致します。(レモン)

  • SSIでの"?"の使い方

    ある検索エンジンCGIのログを流用してトップページにSSIで表示しようとしています。 検索エンジンはいくつかのジャンルに分かれています。トップページに表示する分もジャンルで分けたいと思います。また、保存されているデータの最新10件を表示したいと考えています。 そのため以下のようにやってみました。 ページには □ジャンル1 <!--#exec cmd="./list.cgi?pt=0" --> □ジャンル2 <!--#exec cmd="./list.cgi?pt=1" --> ~~ CGIは ---------------------- #!/usr/bin/perl $w_new = 10; require './jcode.pl'; print "□ジャンル1<BR>\n"; #この行はテスト用ダミーです。 open (FILE,"./cgi-bin/navi/A.bak"); $i=0; while (<FILE>) { $i++; local($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs) = split(/<>/); if ($pt eq $in{'pt'}){ print "<A href=\"$hp\">□$sub</A><BR>\n"; if ($i >= $w_new) { last; } } } close(FILE); exit; ------------------------ $ptがジャンル、$subが表示名、$hpがアドレスです。 こうすると何も表示しません。 また、 <!--#exec cmd="./list.cgi" --> というかんじで"?"を抜くとダミー用文「"□ジャンル1」が表示されます。(SSIが表示できないわけではないと言う確認) SSIのときは"?"は使用できないのでしょうか? また、スクリプトはこれであっているのでしょうか?(合ってないから表示しないわけで…(T.T))

    • ベストアンサー
    • CGI
  • ローカルサーバーでの動作確認

    CGI超初心者です. 翔泳社のPERL/CGI辞典を見ながらCGIに挑戦してます. 今ローカルサーバーでの動作確認すべく奮闘しているのですがCGI/SSIを使用するためのAPACHEの設定で頭を悩ませてます. CGIはうまく表示できたのですがどうしてもSSIが表示されないのです. ファイルは本通りに記述したつもりです. 「test.shtml」 <HTML> <BODY> <!--#exec cmd="test.pl" --> </BODY> </HTML> 「test.pl」 #!C:\perl\bin\perl print"hello!"; CGI/SSIはドキュメントルートで制限なく使用できるよう設定しました. test.shtmlは表示されてるようなんですがそこにtest.plが読み込めてないようです(よく分かりませんが…) どこが悪いのか全く分かりません. ブラウザ上でこのtest.shtmlのソースを確認したら<!--#exec cmd="test.pl" -->の部分が表示されてませんでした. 全くの初心者でどのような情報を開示すればよいのか分からないので必要な情報があれば教えていただけるとありがたいです.

    • ベストアンサー
    • CGI
  • 「 <!--#exec cgi="***.cgi" --> 」が表示されません

    「main.cgi」というファイルを作り、単純にHTMLを表示するだけのCGIファイルを作成しました。 こんな感じ ------------main.cgi------------ #!/usr/local/bin/perl print "Content-type:text/html\n\n"; print <<EOM; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title></title> </head> <body> <略> </body> </html> EOM __END__ -------------------------------- それで、ほかのHTMLファイルに <!--#exec cgi="main.cgi" --> と入力してそのページを見てみると、 [an error occurred while processing this directive] 上の文章が表示されていました。 どうすれば「main.cgi」の内容を表示することができるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • htmlでCGIを作動させたい

    PC用とモバイル用のサイトを作成しています。 http://www.abc.com/ にアクセスすれば自動で振り分けするよう index.cgiというCGIスクリプトを作成しました。 それをindex.html内に組み込んで自動でCGIを呼び出すことは可能でしょうか? 何故わざわざindex.htmlをつくるかというと、METAタグで検索エンジンに引っかかるようにする為です。 <!--#exec cmd="index.cgi"--> を入れてみましたが、振り分け先リンクが表示されるだけで自動では飛んでくれませんでした。 以下、index.htmlのソースです。 <html> <head> <title>ああああ</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta name="description" content="ああああ"> </head> <!--#exec cmd="index.cgi"--> </html> 拙い文章&初歩的な質問で申し訳御座いません。 何卒よろしく御願い致します。

    • ベストアンサー
    • CGI
  • PerlでHTMLを読み込み記述されたSSIコマンド(exec)の実行を実現するには。

    HTMLファイルを読み込んで表示するCGIを作っています。 それで、そのHTMLファイルに記述されたSSIコマンドを、 そのCGIで認識して、それを実行する。ということを実現したいと思っています。 includeコマンドは簡単に実現ができたのですが、 execコマンドが完全には実現できません・・・。 一応、openのパイプを使って、 <!--#exec cmd="test.cgi" --> のようなコマンドを認識しそれを実行して返すことはできました。 しかし、test.cgi?a=wのように パラメータをつけての実行が実現できません。 もちろん、SSIと同じように、 execコマンドで実行する先のCGI、プログラムなどを 改変することなくそのまま実行できることが条件です。 (例えば、$ENV{'QUERY_STRING'}ではなくARGVを使うようにするのではダメなんです) お知恵をお貸しいただけると幸いです。 どうかよろしく御願いいたします。

    • ベストアンサー
    • Perl
  • SSI で引数をCGIに渡したいのですが、

    SSI で引数をCGIに渡したいのですが、 HTMLの記述を <h1>1行目<!--#exec cmd="./emoji.cgi 0"-->絵文字1行目分。</h1> <h1>2行目<!--#exec cmd="./emoji.cgi? 1"-->絵文字2行目分。</h1> <h1>3行目<!--#exec cmd="./emoji.cgi?2"-->絵文字3行目分。</h1> <h1>4行目<!--#include virtual="./emoji.cgi 3"-->絵文字4行目分。</h1> <h1>5行目<!--#include virtual="test.cgi? 4"-->絵文字5行目分。</h1> <h1>6行目<!--#include virtual="test.cgi?5"-->絵文字6行目分。</h1> として、CGI で $ARGV[0] で使いたいのですが、出力するとSSI部分に [an error occurred while processing this directive] と、ERROEが出力されて、上手く行きません。 ネットで調べてみるとApache バージョンのによってバグが有る様な内容も有りますし、 ASJホスティングサービスのページを見ると ------------------------------------------------------------------------------------------- コマンドライン引数を渡すSSI のご利用はいただけません。 こちらは、suExec ではなくApache の一般的なセキュリティ仕様となっております。 ------------------------------------------------------------------------------------------- と書いてあったりします。サーバーの設定の問題なのでしょうか? サーバーは PC DEPOT系のネットプラッツ、専用サーバー(2万2000円/月・結構無理して払っています)です。 中は、Apache バージョン 1.3.12 ・レッドハット6.2、と聞きました。 ネットプラッツの電話サーポートの方に訪ねたのですが、 「使えるか、使えないか、そこまでのサポートは出来ない」との事でした。 サポートの方はとても親切なのですが、肝心の事が「サポートできません」って事なので サーポートというよりカウンセリング状態で・・・問題が解決できません。 サーバーの設定方法 または 記述方法が有りましたら教えて頂けないでしょうか? 宜しくお願いします。

    • ベストアンサー
    • CGI