Apache2付属のテストスクリプトについての疑問

このQ&Aのポイント
  • Windows版apache2に付属している、cgi-binディレクトリの中にあるprintenv.plという環境変数の一覧を表示するスクリプトについて分からないところがあります。
  • 上の二行(5,6)は環境変数の値を置き換えるための処理です。
  • 6の行は、環境変数の値に含まれるダブルクォーテーション(")をエスケープするための処理です。
回答を見る
  • ベストアンサー

apache2付属のテストスクリプトで不明な点が

Windows版apache2に付属している、cgi-binディレクトリの中にあるprintenv.plという環境変数の一覧を表示するスクリプトについて分からないところがあります。以下がそのスクリプトの内容です。 1#!c:/Perl/bin/Perl.exe 2print "Content-type: text/plain\n\n"; 3foreach $var (sort(keys(%ENV))) { 4 $val = $ENV{$var}; 5 $val =~ s|\n|\\n|g; #ここと 6 $val =~ s|"|\\"|g; #ここです 7 print "${var}=\"${val}\"\n"; 8} 上の二行5,6はどういうことをやっているのでしょうか? 正規表現を使って文字を置き換えているというのは分かるのですが、どうしてこれらを置き換えるのかが分かりませんでした。5をコメントアウトして実行してみると、する前と比べて違う点に一点だけ気づきました。実行結果の一覧の中に、SERVER_SIGNATUREという環境変数があるのですが、これの値の最後に\nがすでにあり、これが改行と判断されてしまうことを避けるためにこの行があるのだと考えました。しかし6についてはさっぱり意図が分かりません。そもそもこの行をコメントアウトするがしまいが実行結果は見た限り変化しませんでした。 整理しますと、 WindowsXPにおける環境変数SERVER_SIGNATUREにはなぜ\nが最後に含まれているのでしょうか? また、6の行は一体何をやっているのでしょうか? 皆様よろしくお願いします。

  • Perl
  • 回答数11
  • ありがとう数9

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

  • ベストアンサー
noname#9431
noname#9431
回答No.11

いや、私は初心者なので、私の言うことは参考程度に留めて下さい。現にこれまでもウソ言ってますし。 まず、 >その値を「aroot」から「"aroot」などとしてみるとenvコマンドの結果が「"aroot」ではなく「root」となってしまいました。他にも「"aro"ot」などとしてみると、envの結果が「"aro"ot」ではなく「aroot」となってしまい、 って、正しいですか? 「aroot」から「"aroot」などとしてみるとは、 USERNAME="aroot" を USERNAME="\"aroot" にしてみたということですよね。 そうしたら、envでは USERNAME=\aroot と表示されるはずなんですが。。。 USERNAME="\"aro\"ot"としてみると、envの結果は USERNAME="aro"ot となりません? bashにとって、"がperlと同様、特別な意味をもつ点はそうなのですが。 >想像なのですが、...Windowsでは環境変数がシステムにセットされる時点で「\」や「"」は何ら処理がされないのだと思います GUIでセットするならたぶんそうだと思いますが、おそらく、CUIでもセットできて、そのファイル内では同じ事情になっているのではないかと思います。推測ですが。 その昔私がPC-98なんかを使っていたときは、環境変数は、autoexec.batなる、linuxの.bash_profileにあたるファイルを手で編集して設定しておりました。 そこではやはり"は特別な意味があって、 TEST="\"test" のように記述できるのではないのかと思います。GUIはこのファイルに書きこむための単なる1手段だと思っているのですが。。。まさか昨今のwindowsは設定ファイルをユーザがエディタなどで直接弄れないようになってしまっているのでしょうか。。。もしエディタで編集できるのなら、試してみると良いかも知れません。 >No8の回答の中段以降によれば...それはちょっと飲み込めません。 そう考えないと、s|\n|\\n|の意味が今度なくなるかな?とおもったものですから。 .bash_profileで USERNAME="test\n" とすると、envでは USERNAME=test\n と表示されますよね。つまりシェルは\nを文字通り\nで解釈します。 でも、perlのなかで、 $ENV{TEST}="test\n"; と設定すると、\nはパールが改行コードと解釈します。 まあ、あまり厳密なことをいいだすと、#10に書いたように説明に一貫性をたもつのが面倒になるので、それほどこだわりませんが。 最後に、この場合、${var}は$varでいいです。 $var="test" とあったとき、"test"につづけてableを表示させたいと思って、 print "$varable"; と書くと、$varableと1つの変数と解釈されてしまう。そこで、 print "${var}able" とします。こういうときに使うのですが、今は無くても大丈夫です。

tochanx
質問者

お礼

お礼が遅れてしまい申し訳ありません。 pcがクラッシュし、復旧に時間がかかってしまいました。 ここまでご親切にお付き合い下さい。本当にありがとうございました。あなた様のおかげでいろいろと学べました。 >USERNAME="\"aroot" にしてみたということですよね。 いえ、すみません、書き方が悪かったですね。 そのまま「"aroot」と入れたということです。つまり「""root"」ということです。

その他の回答 (10)

noname#9431
noname#9431
回答No.10

ゴチャゴチャといって混乱させてしまいましたが、単に環境変数をどう表示させるかだけの問題で、そこを厳密にしないとなにか問題が生じるようなものでもないので、単純に、 「\nを置換するのはそうした方が見やすいし、  "を\"に変えるのは、  TEST=""test""  って、どの"がペアなのか意味分らなくなって気持ち悪 いから、  "\"test\""  とでも標記しとこか。これは環境変数の中味が"test"って意味ね。」 って感じで軽く考えたほうがよいのかもしれませんね。 そうしないと、なんで\tは返還しないんだ、\cは?\aは? ってことになってしまいますから。

tochanx
質問者

補足

理解できました。何度も何度もお世話になり、本当にありがとうございます! 今回のことで自分の見識・理解力の狭さを痛感しました。ここまでお付き合い下さり、深謝です。 最後に、よろしければ、私が理解したと思っている内容を書きますので、答え合わせしてもらえないでしょうか?今回のケースはLinuxとWindowsというシステムの違いが私の理解を困難にしていたと気づきました。ですので実際にLinux機でもいろいろと試してみて、その結果もふまえての私なりの理解の結論を書かせていただきたいと思います。 Googleで調べてみますと、今回のスクリプトと全く同じものが(perlのパス指定は違いますが)Linux用のものでも使われているのだと知りました。つまりこのスクリプトのやっていることのメインはLinuxを想定したものなんだと理解できました。どういうことかというと、Linuxでユーザーホームディレクトリの.bash_profileに記述されている環境変数を利用して実験してみました。.bash_profileにはUSERNAMEという環境変数が記述されており、その値を「aroot」から「"aroot」などとしてみるとenvコマンドの結果が「"aroot」ではなく「root」となってしまいました。他にも「"aro"ot」などとしてみると、envの結果が「"aro"ot」ではなく「aroot」となってしまい、このように「"」が特殊な文字として解釈される環境では環境変数に「"」をそのまま記述するのは避け、「\"」とするのだと理解できました。そうすると「"aro"ot」などもenvできちんと「"aro"ot」と表示されました。つまり、printenv.plはこのLinuxの環境変数の値を忠実に(\までも)再現するため、もしくはGokigenHoiHoi様がNo10でおっしゃっているように"が乱立すると視認性が落ちるため、抜き取られた「\」を補完するのだと理解しました。ここまでがLinuxでの話で、Windowsにおいては少し事情が異なります。想像なのですが、Linuxでは.bash_profileなどで記述された環境変数は、それがシステムにセットされる時点で「\」や「"」が特殊文字として認識され、相応の処理がなされるのに対して、Windowsでは環境変数がシステムにセットされる時点で「\」や「"」は何ら処理がされないのだと思います。その結果今回のスクリプトの6の行がかえって仇になってしまったのだと思います。Linuxだったら\は環境変数にセットされた時点で抜き取られているため元の値を忠実に再現するには特殊文字に対して\を補完する必要がありますが、Windowsでは\は抜き取られないため、さらに\を追加するはめになり、視認性を逆に下げてしまいます。GokigenHoiHoi様のNo8の回答の中段以降によればこの6の行はシステムの差異は度外視して、perl内部(スクリプトprintenv.pl内)で環境変数を設定する状況を想定したとありますが、それはちょっと飲み込めません。そこまで想像するよりは、このスクリプトの作者がWindowsでも当然「"」や「\」は特殊文字として認識されるのだろうと思い込んでしまった勘違いではないかと想像しますが、いかがでしょうか? すみません、最後にあと一つだけ、お聞きしたいことがあります。今になって気づいたのですが、今回のスクリプトの7行目、なぜ$varと$valは{}で囲まれているのでしょうか?{}を両方ともはずして実行してみましたがエラーは出ず、また実行結果もそれ以前と同じでした。 GokigenHoiHoi様にもう足を向けて寝られません。本当にありがとうございました!私の理解がなお間違っていましたら、どうか、最後に正してやってください。お願いします。 (お礼に書こうとしたのですが、1000文字を超えていると注意されたので、失礼ながら補足にてお礼させていただきました。ご容赦のほどを。)

noname#9431
noname#9431
回答No.9

>つまり、6の行は、Linuxやperlのような「"」や「\」が特別な...そのために6の行がある。 この部分は仰っている理解でいいと思います。 は、「Linuxのような、」の部分は除外して考えて下さい。 「Perlにおいて、」 です。 標語的にいえば、Perl一元論」で理解するのがよいとおもいます。 (結果的にlinuxのshellとperlで文字列の扱い方が似ているのですが。)

noname#9431
noname#9431
回答No.8

こんにちは。混乱させたようでもうしわけないです。 >つまり、6の行は、Linuxやperlのような「"」や「\」が特別な...そのために6の行がある。 この部分は仰っている理解でいいと思います。 print "${var}=\"${val}\"\n"; とわざわざ右辺両脇に"がつけて表示してあるので、Perlの中で、 $ENV{TEST}="..."; と(もし)定義した場合の、中味...が表示されるようにしてあると考えられます。 >しかし「"」や「\」が特別な文字として解釈されないWindows環境ではこの行は無意味、ということでしょうか? この部分に関しては私は以下のように解釈してます。 環境変数の設定はシステム(OS)側で設定できるものですが、その設定方法はシステム依存です。Perlのあずかりしらぬところです。GUIで設定することもできますし、autoexextive.bat(なんて今もあるのかな?)を直接設定することでGUIを使わず設定できるでしょう。しかも、その設定方法は、極端な話、明日変るかも知れません。 一方、Perlでもシステムのもつ環境変数を弄れます。その設定法はPerl自身よく知っています。(何で囲めば、なにがエスケープ文字として解釈されるか等)だから、環境変数一覧を表示するに際しては、Perl内で $ENV{TEST}="..."; と(仮に)設定したとしたとした場合の...の中味を表示することにしました、というのが、6行目を加えた人の気持ちではないかと推測します。 print "${var}=\"${val}\"\n"; とわざわざ右辺両脇に"がつけて表示してありますし。 Windowsでも、あくまでPerl内で環境設定をした場合の、 ENV{TEST}="..." の...の部分を書いているのだと思います。その振舞いに関しては、perlの中で閉じている話なので、システムが何であろうが振舞いは同じです。 systemによらず、あくまで(仮に)Perl内で$ENV{TEST}="..."; で環境変数設定したときの...を表示さるようにしたかった。そう考えればよいのではないでしょうか。 もちろん、windowsの窓に入力したそのもの、つまり変数の中に入っているものそのものを表示するようにしてもよいと思います。(ただしその場合7行目右辺は"で挟まない形で表示するのが良いと思いますが。)まあ、いってみれば好みの問題です。 ただ、6行目をつけた人の気持を推し量ると、上のような説明がつけられると思います。

noname#9431
noname#9431
回答No.7

>その後の説明は多分合っていると思いますが。。。 もウソです。なんどもすみません。 >print文の引数の解釈でperlが抜き取る\を予め加えてあげているのだと思います。 これがウソ。 print文が変数に入った\を抜き取るということはないのですね。ああ、大嘘いってました。 はじめの定義の段階で\がエスケープとしてぬかれてENV{TEST}に入りません。でも""でかこまれた中味という意味での「定義」には入っている。これを復活させるために6行があるだけですね。 つまり私の説明は大嘘で、納得しなかったtochanxさんが 正確な判断をしていたということです。すみません。 ちなみに、'で囲んだ定義では\"は特別な意味を持ちませんので、また振舞が違います。それで、わざわざ 7行目で"で囲ったものとして表示させているのではないでしょうか。そのため、7行目の$valの中味は(perlのように"の中で\がエスケープとして特別な意味をもつ状況下で)""で囲んで定義したときのその中味が欲しいので、\を復活させるために6行目があると言うわけなのだと思います。

tochanx
質問者

お礼

親切に何度もご回答下さり感謝の極みです。 ずいぶん考えてみたのですが、混乱するばかりで理解できませんでした。申し訳ありません。 少し整理させて下さい。 つまり、6の行は、Linuxやperlのような「"」や「\」が特別な文字として解釈される環境において、環境変数の値にユーザーが「"」を記述する場合、「"」をそのまま書くのではなく、「\"」とエスケープして書くので、perlで変数にその環境変数を読み込んだ時点で、「\」が抜かれてしまう。prinenv.plでは「\」が抜かれた形ではなく、「\"」生のままでの情報が欲しいので、そのために6の行がある。しかし「"」や「\」が特別な文字として解釈されないWindows環境ではこの行は無意味、ということでしょうか?(これであってるでしょうか?) だとしたらどうしてこのスクリプトには6の行があるのでしょうか?このスクリプトがLinux版apacheのものをそのままコピーしたものだとしたら納得できるのですが、今回のスクリプトは1行目が明らかにWindowsを想定して書かれたものです。だとしたら6の行は明らかに不要ですよね?一体どういうことなのでしょうか?

noname#9431
noname#9431
回答No.6

#2での 環境変数にエスケープされた形で入っていることを忠実に表してやりたいためですね。 の言い方が誤解をあたえますね。というより間違ってますね。\がすでにエスケープのいみで使われて、定義には\があっても中味には\が入っていませんね。 「入っている」は「定義されている」が正しい言い方ですね。その後の説明は多分合っていると思いますが。。。 すみませんでした。

noname#9431
noname#9431
回答No.5

>私の環境では、環境変数PATHEXTの値を、「.COM;.EXE;…;WSH;」から「\".COM;.EXE;…;WSH;\"」に変更して この設定どこでやってるのですか?ウィンドウズのGUIとかでしょうか? "や\が特別な意味をもつ環境の下でセットしてやって初めて私の言っている状況になります。 Perlやshellなど、"が特別の意味をもつ状況の中で ENV{TEST}="\"test\""; としたとき、この\はエスケープとして解釈されてENVの中味には入りません。ENV{TEST}の中味は"test"です。 でも、「定義」と私がいっているのは、「<Perlやshellで>定義したときの右辺の""の中味」のことです。 でも、実際にENV{TEST}の中に入るのは"test"です。つまり、定義と実際のENV{TEST}の中味は違い得ます。 WindowsのGUIの入力窓などがもし"を特別なものとみなさず、したがって、\もエスケープとして解釈されないのなら、その入力窓で\"test\"と打ち込んだものは、それそのものです。つまり、PerlのなかではENV{TEST}="\\"test\\""として定義したことと同じことになります。 そう考えると私の言っていることと辻褄が合うのではないでしょうか? 因に私の環境はLinuxでWindowsはほとんど使わないので、本当に\がエスケープとして解釈されないかどうかは確信がないですが、振舞からいうと上のような説明になるのではと思います。

noname#9431
noname#9431
回答No.4

私が言いたいことはこんなことです。 #!/usr/bin/perl $ENV{TEST}="\"test\""; # $ENV{TEST}の定義は\つき。 $val=$ENV{TEST}; # $valに置き直して print "\"$val\"\n"; # こうするとエスケープはperlが解釈してしまい # ""test""と表示される。 # 本当は定義のまま"\"test\""と\つきで表示して欲しい $val =~ s|"|\\"|g; # そのためには"1つにつき\を1つ余分につけてやればよい。 print "\"$val\"\n"; # これは "\"test\""と表示され、まさに$ENV{TEST}= # の右辺が表示された。

tochanx
質問者

お礼

早速のご回答、ありがとうございます。 私の理解力が乏しいゆえ貴重な時間を消費させてしまい申し訳ありませんm(__)m 回答の内容、とてもよく理解できました。GokigenHoiHoi様の記述してくださったソースを実行してみますと、その通りであることが納得できました。 ですが、どうにも腑に落ちないのですが、下にも書きましたように私の環境では、環境変数PATHEXTの値を、「.COM;.EXE;…;WSH;」から「\".COM;.EXE;…;WSH;\"」に変更してPCを再起動し、6をコメントアウトした上で再度printenv.plを実行すると、\が抜けるということは起こらずに、そのまま「PATHEXE="\".COM;.EXE;…;WSH;\""」と表示されます。逆に6を有効にすると、「PATHEXE="\\".COM;.EXE;…;WSH;\\""」となってしまいます。 どうしてこのようなことになってしまうのでしょうか? 変数valに環境変数配列からPATHEXTの値「\"xxx\"」が代入された直後にprint文でその値を出力してみると(5と6の間にprint "$val\n";を挿入)おかしなことが分かりました。 本来なら、printが\"を解釈して、\が抜け、"のみになるはずが、そうはならず、\"のままで出力されているのです。 GokigenHoiHoi様の提示してくださった例では、ちゃんとprintは\"を解釈しているのに、printenv.plではそうではないようなのです。 ひょっとして私はさらに勘違いを重ねているのでしょうか… 何か分かりましたら教えてください。何度も何度も申し訳ないのですが、よろしくお願いします。

noname#9431
noname#9431
回答No.3

ちなみに、\nについても#2と同じ理由と考えるのが正しいのではないかと思います。つまり、環境変数の定義式の右辺の"..."の中味...をそのまま表現するため。だから、本来は、\tなんかも同様の処置をしてあげるべきなのでしょうけれど。。。

noname#9431
noname#9431
回答No.2

>特にエスケープしなかったからといってエラーは起こりませんでした。 すみません。確かめずに書きこんだため、ウソいってしまいましたね。 私の環境でもエラーになりませんでした。 "をエスケープするのは、環境変数にエスケープされた形で入っていることを忠実に表してやりたいためですね。 つまり、 PATH="\"xxx\"" と定義されているものがあったら、 6行目なしでは、\が抜けて表示されます。 PATH="..."の...には\付きで定義されていることが表現されません。それを表現するために、print文の引数の解釈でperlが抜き取る\を予め加えてあげているのだと思います。

tochanx
質問者

お礼

何度も申し訳ありません。ご回答ありがとうございます。 >"をエスケープするのは、環境変数にエスケープされた形で入っていることを忠実に表してやりたいためですね。 とのことでしたので、実験してみましたが、どうもうまくいかないのです。 環境変数PATHEXT=\"xxx\"と設定し、再起動後、printenv.plを6をコメントアウトして実行してみたのですが、\が抜けるということはありませんでした。むしろ6を有効にした場合は、\\"xxx\\"となり、逆に忠実ではないのではないか、とも思えます。 6は一体何をやっているのでしょうか… 私の勘違いかもしれません。もう少しお付き合い願えないでしょうか? よろしくお願いします。

noname#9431
noname#9431
回答No.1

>上の二行5,6はどういうことをやっているのでしょうか? 仰る通り、それぞれ、\nと"が最後のprint内で特別の意味をもつので、それをエスケープしているのだと思います。 "をエスケープするのは、そうしないともし環境変数に"が含まれる場合、エラーになるからでしょう。 (なお、現在の環境変数に"が含まれていなくても、環境変数はユーザがかってに定義できるので、その保険でしょう。) \nをエスケープするのは、単に見やすさのためと思われます。 >WindowsXPにおける環境変数SERVER_SIGNATUREにはなぜ\nが最後に含まれているのでしょうか? これについては分りません。

tochanx
質問者

お礼

早速の回答ありがとうございます!! >\nをエスケープするのは、単に見やすさのためと思われます。 なるほど、納得しました。 ひとつ気になる点があります。 >"をエスケープするのは、そうしないともし環境変数に"が含まれる場合、エラーになるからでしょう。 とのことでしたので、実際に環境変数に"を追記して実験してみました。WindowsXPのマイコンから設定できる環境変数とprintenv.plで出力している環境変数にはずいぶん差があり、共通するものはあまりなかったのですが、PATHEXTの値がお互いに存在していたので、それの値に"を追記し、再起動後、再びprintenv.plをブラウザから呼び出し、6の行をコメントアウトする場合としない場合とを比較してみました。 "のエスケープをしなかった場合、つまり6をコメントアウトした場合は追記した"がそのまま表示されます(PATHEXT=".COM;.EXE…;.WSH"")が、エラーは起こりませんでした。またコメントアウトしない場合は"が\"となりエスケープされていました(PATHEXT=".COM;.EXE…;.WSH\"")。 確かにエスケープはされていますが、特にエスケープしなかったからといってエラーは起こりませんでした。 他の環境変数ではまだ試していないのですが、環境変数内で"がエスケープされないことにより発生するエラーとは具体的にどのようなものなのでしょうか?

関連するQ&A

  • apache1.3とperlでCGI

    超初心者です。 windows XPでapache1.3 と active perl 5.1.2をインストールして、 CGIを動作させたいと考えています。 http://localhostを入力してapacheの起動画面は表示されていること を確認しました。 その後httpdconfに下記を追加しました。 AddHandler cgi-script .cgi .pl AddType application/x-httpd-cgi .cgi AddType application/x-httpd-cgi .pl <Directory "C:/Program Files/Apache Group/Apache/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> C:\Program Files\Apache Group\Apache\cgi-binに既存で存在する printenv.plを実行しようとするとファイルのダウンロードの画面が出てきて 実行されません。printenv.plは下記のようにperl.exeへのパスだけ変更しました。 #! C:/Perl/bin/perl ## ## printenv -- demo CGI program which just prints its environment ## print "Content-type: text/plain\n\n"; foreach $var (sort(keys(%ENV))) { $val = $ENV{$var}; $val =~ s|\n|\\n|g; $val =~ s|"|\\"|g; print "${var}=\"${val}\"\n"; } どうすればCGIが実行できるようになるのでしょうか? ご教授ください。よろしくお願い致します。

    • ベストアンサー
    • CGI
  • apacheでcgiがうまく動かない。cgiが認識されていない?

    すいません、多分基本的な所なのですが、 どうしても分からないので質問させてください。 ■環境------------------------------ ・windowsXP sp2 ・apache1.3.33 C:\Program Files\Apache Group\Apache  現在の状態:html表示可能。httpd.confを変更 ・perl5.6.1 c:\perl  現在の状態:PPMにてimagemagick,DBI,DBD-MySql(だっけ)をインストールしている ・php5.0.4 c:\php ・mysql4.02 C:\mysql ■httpd.confの変更箇所-------------------------------- 337 Options Indexes FollowSymLinks MultiViews ↓ Options Indexes FollowSymLinks ExecCGI MultiViews 538 #!c:/program files/perl/perl ↓ #!C:/Perl/bin/perl 720以降に追加 AddType application/x-httpd-cgi .cgi AddType application/x-httpd-cgi .pl 825以降に追加 AddHandler cgi-script .cgi AddHandler cgi-script .pl ■printenv.plの内容-------------------------------- #!C:/Perl/bin/perl ## ## printenv -- demo CGI program which just prints its environment ## print "Content-type: text/plain\n\n"; foreach $var (sort(keys(%ENV))) { $val = $ENV{$var}; $val =~ s|\n|\\n|g; $val =~ s|"|\\"|g; print "${var}=\"${val}\"\n"; } -------------------------------------------------- 上記のような環境で、いまPERLの動作確認を行っています。 http://localhost/cgi-bin/printenv.pl http://localhost/cgi-bin/printenv.pl PLファイルを指定しても実行されず、ダウンロードされてしまいます。 cgiに拡張子を変えても同じでした。 エラーというわけでもない為、エラーログにも何もかかれません。 何が問題なのでしょうか?

    • ベストアンサー
    • CGI
  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • Perl
  • Apacheでcgiができないんです。

    以下のホームページと同じように、設定したのですが。。。 http://www.futomi.com/lecture/apache/config.html 下のcgiは実行できます。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>Apache</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "<H2>Welcome to my computer, Apache Server!</H2>\n"; print "</BODY>\n"; print "</HTML>\n"; しかし、下のcgiは実行できません。htmlファイル、cgiファイル共に、あるホームページからコピペしたので、間違いないと思います。ここではhtmlファイルは書きませんが、以下のURLです。 http://www2j.biglobe.ne.jp/~apollo/server/apacuse.html #!/usr/local/bin/perl $countfile= "count.dat"; open(IN, "< $countfile"); $count = <IN>; close(IN); $count++; open(OUT,"> $countfile"); print OUT $count; close(OUT); print "Content-type: text/plain\n\n"; print $count;

    • ベストアンサー
    • CGI
  • ActivePerlとApacheを自分のPCにインストールしたのですが・・・。

    お願いします。 ActivePerlとApacheを自分のPCにインストールし、 CGIのテストを試みました。 Apacheのインストールは上手くいったのですが、ActivePerl がどうもうまく動きません。 Perlのインストール後、環境変数を Path→「C:\Perl\bin\;C:\Perl\bin;C:\Perl\bin\」に変更、 htdocsフォルダ内にメモ帳で記述したhello.cgiを保存後、 ブラウザにh t tp://localhost/hello.cgiと入力しても ファイルが見つかりませんと返されます。 ちなみにhello.cgiの中身は #!C:/Perl/bin/perl print "Content-Type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "<h1>Hello World!</h1>\n"; print "</body>\n"; print "</html>\n"; exit; です。使用マシンはWIN XPで ActivePerlのバージョンは5.8.8,Apacheは2.2.4です。 何か助言がございましたらよろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl+DBI+Apacheの動作

    #!C:\\Perl\\bin\\MSWin32-x86-object\\jperl use DBI; print \"Content-type:text/html\\n\\n\"; print \"<html><body>test script</body></html>\\n\"; という内容のスクリプトを指定したフォルダの中に入れても、「test script]とブラウザ上に表示されません。そのまま「#!C:\\Perl\\bin\\MSWin32-x86-object\\jperl use DBI; print \"Content-type:text/html\\n\\n\"; print \"test script\\n\";」と 表示されます。 Apache、ActivePerl、Mysql、DBI、DBDはインストールし、Apacheも動作しているのは確認できます。 どうしてなのでしょうか。解決方法を教えていただけると助かります。どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • シェルスクリプトの1行目に#!を書いてもダメなのはなぜ?

    test.shというシェルスクリプトを #!/bin/bash echo "bash test" のように書き、chmod +x test.shを実行し、 test.shと入力すると、bash testが表示されるはずですが、 エラーbash: test.sh :command not found が出ます。which bashでパスを見ると /bin/bashなので、問題ないはずなんですが。 ちなみに、bash test.shと入力すると、正常に実行されます。 同様のことがperlスクリプト #!/usr/bin/perl print "perl test\n"; についても起こります。 何か設定がまずいのでしょうか? RedHatLinux7.2を使用しています。

  • CGIのテストに失敗

    ただ今ホームページを作成中で、CGIに興味を持つようになりました。 簡単なところから実際にやってみようと思い、Active PerlとAN HTTPDをダウンロードしてインストールまで完了。 ネットのCGI講座や入門といったサイトを参考にしながら、AN HTTPDの設定はできたのですが、簡単なはず?のCGIのテストに失敗してしまいました。 以下のような記述でファイル名をtest.cgiにして、httpd.exeと同じフォルダのcgi-binというフォルダに保存、http://localhost/cgi-bin/test.cgiでブラウザから開こうとしたのですが、ダメでした。 #!C:\Perl\bin print "Content-type: text/html\n\n" ; print "Hello, World!" ; 何がまずかったのかわかりません。Active Perlはデフォルトでどこもいじっていません。環境変数のPathもC:\Perl\bin\になっているのですが…。いろいろと見てまわったのですが間違いがわかりません。 どなたか教えていただけると幸いです。

    • ベストアンサー
    • CGI
  • Perlをcshスクリプトに書きなおしたい

    以下のPerlで書かれたCGIをcshスクリプトに書き直したく思っています。 #!/usr/local/bin/perl # load libraries require ("/usr/local/bin/cgi-lib.pl"); # cancel stdout buffering $| = 1; # header response print "Content-type: text/html\n\n"; print STDOUT "<HTML><HEAD></HEAD><BODY>\n"; &ReadParse; open(COMM, "|./message > ./message.out") || die; $in_text = $in{"Name"}; print COMM "Name: $in_text\n"; ... "Name"という変数名で受け取った文字列を$in_textに代入している ようですが、この辺りの処理、cshではどう書けばよいのでしょうか。

    • ベストアンサー
    • CGI
  • 私の作ったCGIスクリプトを見てください。どこが間違えていますか

    アクセスありがとうございます。 Red Hat Linux8.0でサーバを構築してCGIスクリプトを実行しようとしているのですが、どうもうまくいきません。 私が作成したCGIスクリプトは次のようなものです。 ファイル名「first.cgi」 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>First CGI</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "文字を表示するCGIです。\n"; print "</BODY>\n"; print "</HTML>\n"; そして文字コードを「EUC」、改行コードを「LF」に変換しサーバにアップロードしました。 その後SSHでサーバにログインし $ chmod 755 /home/burn/public_html/first.cgi と「first.cgi」に実行権限を追加し $ /home/burn/public_html/first.cgi と作成したCGIスクリプトをテストしてみたのですが : bad interpreter: No such file or directory とエラーメッセージが表示されてしまいます。 「そのようなファイルやディレクトリはありません」というような意味でしょうか。 しかし、そんなはずはないと思います。 $ ls /home/burn/public_html first.cgi と「ls」コマンドを実行すれば「first.cgi」が表示されるのですから。 他に何かする必要があるのですか。 このCGIスクリプトを動作させるにはどうすればいいのか教えてください。

専門家に質問してみよう