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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

補足受けましたhyde-laです


結論から言いますと、無視されるようなことはありません。
飽くまで「結果」をどう扱うかという話ですので。
この場合の結果とは、プログラムの標準出力へ出力されたものという意味です。
#EXEC CMDでは、プログラムの「標準出力」を結果としてブラウザに表示するだけです。

UNIXやDOS等、多くの環境には「標準出力」という考え方があります。
これはPRINT文などで出力される場所で、つまりデフォルトでは画面です。
(標準出力はリダイレクトという操作を用いて、出力先を変えることが出来ます)
    • good
    • 0
この回答へのお礼

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

お礼日時:2000/12/24 01:53

SSIは基本的に「コマンドを実行してその結果を返す」ためのものです。


ですから、
#exec cmdの場合だと「これはブラウザに結果を返しますよ」
という前提の下で結果が処理されますので、正常に出力されます。

しかし#exec cgiでは、既に「CGIとしてブラウザに結果を
返します」なので
CGIの中でTmaさんのおっしゃるようにヘッダをPRINTしてやらないと
平常に出力されなくなってしまいます。

ですから、ちゃんとしたCGIを呼び出す時はCGI=""で。
CGI以外のコマンドで、代用のために呼び出すならCMD=""で。
実際にSSIを使える環境にあるなら、以下を試してみてください。

<!-- #exec cmd="ls" -->
<!-- #exec cgi="ls" -->

サーバー上のディレクトリ一覧が正常に表示されたのは
どちらでしょうか?
仕様通りなら、上のものが正常に出力されるはずです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2000/12/22 01:39

後者の「#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"という記述が必要だと
わかるかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2000/12/22 01:26

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q添付画像のファイルはどんな状態のファイルなのでしょうか?クリってもエラ

添付画像のファイルはどんな状態のファイルなのでしょうか?クリってもエラーしか出た事がないのですが

Aベストアンサー

他の回答者様の記入通り、拡張子が無い事には判断出来ません。
また、クリックしてもエラーとありますが、webから探すとか出ませんか?
憶測ですが、多分質問者様のPCにこのファイルを開くアプリケーションが
インストールされていないのではないかな?って思います。
参考までに
よくありがちなのは、XPで作ったエクセルファイル等(逆だったかな^^;)を
ビスタのPCで見ると似たようなアイコンになります。
オフィスの互換パックをインストールすると見れます。

QSSI で #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 に興味をもち Perl を始めました。
簡単なサンプルを無料サーバーにアップロードして cgi だけを
直接実行すると問題なく実行されます。

ですが SSI の #exec を使って HTML ソースに
<!--#exec cgi="/cgi-bin/sample.cgi" -->
と記述してページを開くと
[an error occurred while processing this directive]
と表示されてエラーになりました。

無料サーバーは infoseek で CGI/SSI は使えると書かれていたので
試してみました。それでもう一度確認の為に読んで見ると『#exec』は
セキュ...続きを読む

Aベストアンサー

infoseekのフリーサーバーを利用している者です。
SSI #execが不可になったときに、#include を試してみましたが、その時はプログラムソースがそのままincludeされてましたが、それではあんまりだと、今はエラー表示になったようですね。
No.5でご呈示のHTTP_REFERER編集まではやってませんが、たぶん無理かと思います。
SSIでユーザープログラムを実行させることそのものを排除しているように思います。

あと、#includeに限らず#flastmodなどでもvirtualで絶対パス指定でいけるんですけど、そのshtmlファイルが存在するディレクトリーより上位にさかのぼる位置のファイルは指定出来ないようです。

No.2補足のところでご呈示の方法ですけど、<img src>で一旦呼び出してファイル作成だと、ブラウザがファイルを読みに行くタイミングが前後することがあるので、<script src="sample.cgi"> で直接呼び出してしまう方がよいと思います。
その場合、cgiでのheader記述は以下のようにしないとよけいな宣伝タグ挿入されてJavaScriptエラーになります。
print qq(Content-type: application/x-javascript;\n\n);

修正版 ●HTMLソース(sample.shtml)
----------
<HTML>
<HEAD><TITLE>CGIテスト</TITLE></HEAD>
<BODY>
<!--[JavaScriptファイルの読み込み]-->
<script type="text/javascript" src="/cgi-bin/sample.cgi">
</SCRIPT>
<noscript>
JavaScriptがオフのため表示出来なくて済みません。
</noscript>
</BODY>
</HTML>
----------
修正版 ●Perl-CGI(sample.cgi)
----------
#!/usr/local/bin/perl
print qq(Content-type: application/x-javascript;\n\n);

&sample;
exit;
sub sample{
  $format = "%04d/%02d/%02d %02d:%02d:%02d";
  my($sec, $min, $hour, $day, $month, $year, $week, $yday, $isdst) = localtime();
  print "document.write('";
  print sprintf ($format, $year+1900, $month+1, $day, $hour, $min, $sec);
  print "');\n";
}
----------
全角空白のindentはそのままです。コピー時は注意して下さい。
JavaScriptがオフだと実行されないのは致し方ないかな?

アクセス時刻でなくカウンターなら<img src>呼び出しの書き込みファイルでは「次番号」にしておけば、前回書き込んだファイルを#includeしても違和感はないように思います。
つまり、初期値を1から初めて先に表示用sample.datファイルを作っておきます。
で、No.2補足に有る方のsample.shtmlのscriptタグを以下に置き換えます。
<!--#include virtual="/cgi-bin/sample.dat" -->

SSIの替わりになる対策としては、たぶんこの2つくらいでしょうね。
あと、iframe かな? でもフレーム内にも宣伝が入ってくるのであんまり実用的ではないですけどね。

infoseekのフリーサーバーを利用している者です。
SSI #execが不可になったときに、#include を試してみましたが、その時はプログラムソースがそのままincludeされてましたが、それではあんまりだと、今はエラー表示になったようですね。
No.5でご呈示のHTTP_REFERER編集まではやってませんが、たぶん無理かと思います。
SSIでユーザープログラムを実行させることそのものを排除しているように思います。

あと、#includeに限らず#flastmodなどでもvirtualで絶対パス指定でいけるんですけど、そのshtmlファイ...続きを読む

Q右クリで画像保存が出ない!

画像を取りたくて矢印を画像に置くと!手のマークに代わり!右クリができなくなりました。
どうしたらよいのでしょうか?

Aベストアンサー

最近のサイトでは著作権の問題もあり、勝手に保存ができないように右クリックができないように設定しいるところが多くなっているであります。法律に抵触する場合もあるであります。

方法としては、色々あるでありますが、ただ見えてる画像が欲しいのであれば、プリントスクリーンでPC画面全体をコピーして、ペイントソフトにペースト、余分な部分を削除して保存すればいいと思うであります。

プリントスクリーンはググってほしいであります。

QApachでCGI(Perlスクリプト使用)を動かすときに先頭の#!に関係なく実行できるようにするには。

ApachでCGI(Perlスクリプト使用)を動かすときに先頭の#!のPerlを動かす場所(?)を指定する行が無かった場合や、違う場合でも、Apachが勝手にperlの場所を解釈しスクリプトを実行してくれるようになるhttpd.confの設定方法ってありますか?

Aベストアンサー

> CGI(Perl使用)の部分もあるので、ローカルで実際に動かしてからサーバにアップしています。
> ローカルでの実行環境がApach(for win32)+ActivePerlで、サーバにアップするときにわざわざ#!部分を変更しなければなりません。それが少々めんどくさいので
> 質問したわけであります。

発想の転換をしてみてください。
要するに「she-bang 書き換えが面倒くさい」だけなんですよね?

Apache に依存させるのではなく、ActivePerl を入れなおして、ディレクトリをあわせてみてはいかがでしょうか。
ActivePerl をインストールする際に、例えばサーバ側が
/usr/bin/perl
だった場合、
c:\usr
フォルダを作っておいて、インストール先を c:\usr にしておけば、perl インタプリタの実行ファイルが c:\usr\bin\perl.exe になります。
she-bang を #!c:\usr\bin\perl とすればいいのは勿論なんですが、Apache を介せば、UNIX 表記でも問題ないので、#!/usr/bin/perl と記述することが可能です。当然それなら、いちいち書き換えなくても、サーバ側でそのまま利用することが可能です。

コツとしては、perl のパスの bin ディレクトリの上位まで、Windows 上に作っておいて、インストール先として、そこまで指定します。

/usr/local/bin/perl としたい場合は、c:\usr\local フォルダを作っておいて、インストール先として c:\usr\local を指定すれば、自然と bin ディレクトリが作られ、その中に perl.exe がインストールされます。
で、CGI として使用したいファイルの先頭を
#!/usr/local/bin/perl とすれば、サーバでも Win 環境でも共用できる she-bang が書けますので、そういうことを気にしなくてもいいと思います。
私はかれこれ 3 年間、この方法を使ってます。

> CGI(Perl使用)の部分もあるので、ローカルで実際に動かしてからサーバにアップしています。
> ローカルでの実行環境がApach(for win32)+ActivePerlで、サーバにアップするときにわざわざ#!部分を変更しなければなりません。それが少々めんどくさいので
> 質問したわけであります。

発想の転換をしてみてください。
要するに「she-bang 書き換えが面倒くさい」だけなんですよね?

Apache に依存させるのではなく、ActivePerl を入れなおして、ディレクトリをあわせてみてはいかがでしょうか。
A...続きを読む

Q 友近さんの画像を探しています。本当にいい人で、美人で、セクシーだと思

 友近さんの画像を探しています。本当にいい人で、美人で、セクシーだと思います。着衣・水着・スカート、なんでもOKです(あまり小さいサイズじゃない方がよいです)。どうぞよろしくお願いします。

Aベストアンサー

こちらに数点ありました。
http://bsearch.goo.ne.jp/image.php?UI=web&TAB=web&STYPE=0&CC=1&SCRDEF=0&IMGST=0&IMGSZ=0&IMGC=3&IMGFT=0&IMGFT=1&IMGFT=2&IMGFT=3&MOVPT=0&MOVFT=0&MOVFT=1&MOVFT=2&MOVFT=3&AUDPT=0&NSDP=1&KWDP=1&DC=20&FR=1&SM=mc&OCR=1&SITE=&SITE2=&SITE3=&SITE4=&SITE5=&SITEH=&AUDST=0&AUDMST=0&MOVTHN=0&QGR=1&MOVSC=0&NOJSB=0&QGA=1&NOJS=0&AUDSITE=0&MT=%CD%A7%B6%E1&button=%B2%E8%C1%FC%B8%A1%BA%F7
画像を使用される場合は自己責任でお願いします。

QSSI対応じゃないCGIをSSI対応に…

ホームページに更新記録CGIを設置しているところです。
それ自体はIFRAMEでページに表示させるタイプで、現在ちゃんと動作しています。
しかし1つ問題が…ちょっとページデザインを換えようと思っているのです。
素材配布ページなんですけど、上に一覧の入り口を表で作り、その表の幅を600に設定しました。
その下に同じようなデザインで更新記録CGIをIFRAME表示させようとしました。
しかし、なぜか微妙に左にずれています。更新記録CGIの表はもちろん600に設定しています。IFRAMEの方はスクロールバー分ずれるだろうと思いちょっと広め(680)にして、IFRAME自体はセンターへ、中の表示も中央に設定しました。でも、ずれてしまいます。
この方法をどうにかする方法があればうれしいのですが、どうせならSSIで表示できないかと考えました。これだとセンター表示されるのでは?でも、スクロールはどうなるのかな…際限なく(CGIの表示設定数)表示されるんですかね。
で、現在使っている物がSSI対応じゃないCGIのようです。これをSSI表示させることは可能でしょうか?
サーバのほうは、SSI表示OKでした。
私自身はCGIを0から作ることは出来ませんが、ある程度の改造をすることは可能です。私が出来る(理解できる)かどうかは逐一答えて行きたいと思っています。
何か良い方法がありましたら教えてください。

ホームページに更新記録CGIを設置しているところです。
それ自体はIFRAMEでページに表示させるタイプで、現在ちゃんと動作しています。
しかし1つ問題が…ちょっとページデザインを換えようと思っているのです。
素材配布ページなんですけど、上に一覧の入り口を表で作り、その表の幅を600に設定しました。
その下に同じようなデザインで更新記録CGIをIFRAME表示させようとしました。
しかし、なぜか微妙に左にずれています。更新記録CGIの表はもちろん600に設定しています。IFRAMEの方はスクロールバー分ずれ...続きを読む

Aベストアンサー

> htmlになんと書けばいいのですか?

<!--#exec cmd="プログラムのパス"-->

↑これを書いたところに、プログラムから出力される文字が表示されます。

ただ、SSI対応のサーバでは、ファイル名を ○○.html ではなく、
○○.shtml にしなければならない場合がありますので
その辺りはパーミッション云々も含めて、
サーバの設定に従ってください。

インクルードされるプログラムの方は ○○.cgi でも動く場合がありますし、
○○.pl にしないと動かない場合もあります。
その辺もサーバの設定で。


> 何か法則があるのなら…と思って質問してみました。

print "Content-type: text/html;\n\n";

↑これを削除する理由は、
HTML側ですでに、text/htmlが出力されることになっているからです。

なので、この文章は要らない、という意味で、1行かどうかは分かりません。
2、3行あったら全部削除して下さい。(笑

Q●「美人アプリ」の画像を保存したい!

●「美人アプリ」というアプリを使用しています。

●ここで表示される画像を保存したいのですが、方法がわかりません。可能かどうかも。。

●もし、方法をご存知の方がいらっしゃいましたら教えていただけませんか?おねがいします。

Aベストアンサー

保存したい画像を表示させて、↓の方法で画面をキャプチャすると、写真アルバムから見れます。
http://blog.livedoor.jp/sakusakupocky/archives/50263981.html

QCGI perlでこんなスクリプトをご存知ないでしょうか?

一覧表があって、そこに仮に5個の名前があるとします。

ログインして自分のデータを変更や訂正。
更新されると、一覧表の順序内において、
一番先頭に表示される。

これって一番近いのは、やっぱり掲示板なんでしょうか?
もしこれに近い、無料配布されているサンプルを
ご存知でしたら、お教えいただけませんか?

Aベストアンサー

基本は名簿管理…なのでしょうか?

以下のものはどうでしょうか、更新順に表示も可能です。

■Miniりすと
http://www.minicgi.net/cgi2/list.html

参考URL:http://www.minicgi.net/cgi2/list.html

Q右クリ禁止のサイトの画像を保存

質問の通りなのですが右クリック禁止のサイトの画像を保存できるようにする方法はないでしょうか?あと、よく海外でおもしろ動画とかを見せてるサイトがありますが、そういった動画を保存する方法はありますか?重ねて質問すいません^^;

Aベストアンサー

そのサイトを見ないとなんとも言えませんが、
JAVAをオフにしてみると右クリック禁止がはずれる事もあります。

それで駄目ならば、プリントスクリーンを取って画像を修正してください。
まぁ画像を持ち出されたくないサイトならばあまり持ち出さないほうがよろしいかと思います。

ちなみに動画を保存する場合は専用のソフトなどが必要。

QPerl CGIの中で # を使ってコメントアウト出来ると思いますが、

Perl CGIの中で # を使ってコメントアウト出来ると思いますが、

print "Content-type: text/html\n\n";
&aaa ("<p style='color:#eee'>色</p>");

とかで、'color:#eee' の色指定で # の部分が
誤認識される環境は無いでしょうか?

Aベストアンサー

"と"の間とか、'と'の間とかは文字列として解釈します。
""には変数や?の展開とかは行われますが、それ以外は書かれた文字がそのまま内容になります。
#は#という文字になり、コメントにはなりません。

コメントと「誤認識」されるのは、
引用符無しの文字列を書いたときや
引用符の対応がとれてなく、文字列の外になっているときです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング