- ベストアンサー
私の作った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スクリプトを動作させるにはどうすればいいのか教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>何が疑問かといいますと学校で使っているFTPクライアントも僕が自宅で使っているFTPクライアントも同一の物なのですが学校でアップロードしたスクリプトは問題なく動作するのです。 同じ手順でアップロードされた結果が違うのですよね? FTPクライアントよりも、あなたの学校のサーバもRedHat8+vsftpdですか?そんなに新しくないと思いますがどうでしょう? /etc/vsftpd.confの以下の行を変更してみて下さい。 (変更前) #ascii_upload_enable=YES #ascii_download_enable=YES (変更後) ascii_upload_enable=NO ascii_download_enable=NO vsftpdの転送モードはYES(ascii)が標準なので、 NO(binary)に変更して下さい。
その他の回答 (5)
- xjd
- ベストアンサー率63% (1021/1612)
(検証報告) 私のサーバ RedHat8 + vsftpd FTPクライアント ffftp Windows上で作成したテキストファイルの改行コードを LFに変換して、ffftpでバイナリモードでアップロード したら、Linux側でも改行コードはLFでした。 私の方は解決です。^o^/
お礼
ご返信ありがとうございます。 xjdさん、サーバソフト、クライアントソフトともに僕と全く同じですね!! xjdさんの環境でもアップロードとは別に改行コードの変換作業が必要なのですか。 もしや、この方法が一般的なのですか。 そうだとすれば僕の環境には何ら問題はなく、むしろ学校の環境の方が特別だといえますね。 学校では学生たちがLF変換しなくてもすむように、どこかで自動的に変換してくれるような仕組みが施されているのでしょうか。 とりあえず月曜日に学校の環境を調べてみます。って何を調べりゃいいんだか(汗)。
補足
xjdさんご覧になっているでしょうか。 衝撃的な、ご報告なのですが今、学校から「FFFTP」を使って自宅と学校の両サーバにまったく同じ手順(アスキー)でアップロードしてみましたら、 なななんと、学校では自動的に改行コードが変換されているのに対し自宅サーバでは、そのままでした。 思っていたとおり、これは間違いなくサーバ側の設定の問題なのだと思いました。 ちょっとCGIの先生にメールしてみます。
- k-841
- ベストアンサー率27% (129/465)
>何が疑問かといいますと学校で使っているFTPクライアントも僕が自宅で使っているFTPクライアントも同一の物なの >ですが学校でアップロードしたスクリプトは問題なく動作するのです。 >これについてはなぜだか分かりますでしょうか。 原因は改行コードにあるでしょう。 bad interpreter: No such file or directory これは、きっと /usr/bin/perl<CR> というコマンドがないよ、と言う意味だと思います。 もし動かないcgiがまだ残っているようでしたら、 試しに以下のコマンドを実行して見て下さい。 cat -tev first.cgi これで出力される結果のうち、行末の ^M が <CR> 、$ が <LF> です。 きっと最初の行は #!/usr/bin/perl^M$ と出力されると思います。 この場合は、/usr/bin/perl<CR> というコマンドを探しに行きますが、 当然あるわけないので No such file or directory なわけです。 理由は単純ですが、一見違いがわからないのでタチが悪い問題です。 原因は、もとの改行コードがちゃんと<LF>なら、 ftp転送のときにasciiモードで転送し、 改行コードが<CR><LF>に変換されてしまったからだと思います。 binaryモードで転送すれば、多分大丈夫だと思います。
お礼
ご回答ありがとうございます。 なるほど確か僕の教科書にも、そのようなことが書いてありました。 しかし、このFTPソフトはなんでまたかってに<CR><LF>に変換してしまうのでしょうね。 マニュアルによればアスキー転送モードの場合は自動的にホストに最適な改行コードに変換されアップロードされるそうですが、最不適の間違えではないでしょうか(笑)。 お教えいただいたとおりbinaryモードで転送したら大丈夫でした。 しかし、この場合FTPソフトの文字コード変換機能が使えないので、あらかじめ別のソフトでコード変換を施しておく必要があり少々面倒ですね。 しかし学校のFTPソフトはなんで何もしなくて大丈夫なのだろうか? と未だに僕は疑問に思うのでした。
- xjd
- ベストアンサー率63% (1021/1612)
<Directory /> Options FollowSymlinks ExecCGI AllowOverride None </Directory> とりあえず解決したようですが、 上記の様に設定すると、どこにあるcgiも実行できる指定なのでセキュリティ上おすすめしません。 <Directory /home/*/public_html> Options ExecCGI </Directory> 上記の箇所に記述し、cgiを実行できる場所を限定してください。
お礼
ご返信ありがとうございます。 実は問題が解決した後xjd様にアドバイスいただき書き換える前に作成しておいた「httpd.conf」のバックアップを適用してみたのですが依然としてCGIは実行できるようです。 また「httpd.conf」の<Directory /home/*/public_html>の項目を確認してみると全てコメントアウトされているのです。 それでもCGIは何の問題もなく動いています。 うーん、何かさっぱり訳が分からないです??? またスクリプトについてはWindows上で作成したファイルをFTPソフトのコード変換機能を用いてアップロードしても動作せず またSSHでログインして直接作成したスクリプトは動作するのです。 これにつきましては大いに疑問です。 何が疑問かといいますと学校で使っているFTPクライアントも僕が自宅で使っているFTPクライアントも同一の物なのですが学校でアップロードしたスクリプトは問題なく動作するのです。 これについてはなぜだか分かりますでしょうか。 やはりサーバの設定を何か変更することにより学校と同じ環境が作れるのでしょうか。
補足
スミマセン、ウソでした。 ブラウザを再起動したらCGIが動作しなくなったので 改めて「httpd.conf」を書き換えました。 AddHandler cgi-script .cgiおよび <Directory /home/*/public_html> Options ExecCGI </Directory> の両方を適用させたら再度、動くようになりました。 どうもブラウザのキャッシュ機能が影響して混乱を招いているようです。
- honeorizon
- ベストアンサー率70% (197/279)
>$ /home/burn/public_html/first.cgi >と作成したCGIスクリプトをテストしてみたのですが >: bad interpreter: No such file or directory >とエラーメッセージが表示されてしまいます。 「interpreterが問題:そんなファイルは無いよ」って 言ってますよね。この場合、interpreterとは、 /usr/bin/perlのことです。/usr/binにperlはある 環境ですか?typoしてませんか? それと、 >そして文字コードを「EUC」、改行コードを「LF」に >変換しサーバにアップロードしました。 本当にこの変換はうまくいってますか?特に改行の方。 わざとちゃんと動くperl scriptの改行コードをDOS風 に変えたら同じエラーが出ましたよ。 質問程度のスクリプトなら、まずLinux上で作成して 動作確認した方が問題の切り分けが速いと思うんです がね。それと、文字コード・改行コードの変換も、linux 上でした方が確実だと思う。
お礼
ご回答ありがとうございます。 お、できました。 viエディタで全く同じスクリプトファイルを作成したら何の問題もなく実行できてしまいました。 こんな事って、あるのですね。 ということは僕の使っているFTPクライアントの文字コード変換機能は不良ってことですか。 それでは確実にコード変換を行ってくれるフリーウェアを探さなければならないですね。 もしくはviエディタの操作になれてスムーズに使いこなせるようになるしかないですね。 ともあれ原因が解明できたので今後どのような方法でCGIを作成するかについては、じっくり考えたいと思います。 どうもありがとうございました。
補足
でも僕が学校で使っているFTPクライアントも全く同一なものなのですが学校のサーバにアップロードしたときは問題なくCGIが動くのです。 ???なんでだ??? これについては、どんな理由が考えられますか。
- xjd
- ベストアンサー率63% (1021/1612)
「CGIスクリプトを見てください」の前に、 httpd.confでApacheが一般ユーザのcgiを実行できるように設定しましたか?
お礼
ご回答ありがとうございます。 Apacheですか。 なるほど、どんなにCGIの記述が正しくてもWebサーバが適切に設定されていないとスクリプトは機能しないのですね。 Apacheのデフォルト設定では一般ユーザのcgi実行が許可されていないということでしょうか。 そこで「httpd.conf」の内容を次のように書き換えました。 <Directory /> Options FollowSymlinks AllowOverride None </Directory> ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ <Directory /> Options FollowSymlinks ExecCGI AllowOverride None </Directory> #AddHandler cgi-script .cgi ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ AddHandler cgi-script .cgi しかしこれだけでは、まだCGIは動きませんでした。 # /etc/rc.d/init.d/httpd reload httpdを再読み込み中: [ OK ] # exit $ /home/burn/public_html/first.cgi : bad interpreter: No such file or directory 相変わらず以上のようなエラーメッセージが表示されてしまいます。 他に何か設定する必要があるのでしょうか。 どうぞ教えてください。
お礼
ご返信ありがとうございます。 確か学校のサーバにアップロードするときはアスキー転送モードで文字コードを「EUC」に変換してアップロードしていますが改行コードは指定していません。 例によりFTPソフトが自動的にホストに最適な改行コードに変換してくれているようです。 この機能が、なぜか僕の環境では誤動作して<CR><LF>でアップロードされてしまうようです。 やはりクライアントよりもサーバ側の問題なのですかね。 学校のサーバは最近新しくしたそうですが「RedHat8+vsftpd」かどうかは分かりません。 おそらくクライアントソフトが同一にも関わらず僕の環境だけでエラーが発生しているということは「RedHat8+vsftpd」ではないのでしょうね。 お教えいただいたとおり「/etc/vsftpd.conf」ファイルを書き換えました。 しかし、この設定を適用すると、どうなるのでしょうか。 FTPソフトの「アスキー転送モード」が選択できなくなるのか、とも想像しましたが、そのような事態は発生していません。 従来通りアスキー転送モードが利用でき、また改行コードも<CR><LF>のままでした。 今回バイナリ転送モードを利用すればファイルの形を変えずにアップロードできることを知りましたがWindows上でファイルを作成する以上、なんらかの形でコード変換を行う必要があります。 しかし学校ではそのような操作を行っていないので疑問は膨れ上がります。 ちょっと月曜日に学校のFTPソフトとサーバの様子を観察してきます。