Ubuntu 10.10(Maverick Meerkat)で作業していて、 [〜#〜] cgi [〜#〜] スクリプトを Apache で実行していますが、次のエラーが表示されます。 .。。
[Sat errorNo such file or directory:exec of '/ usr/lib/cgi-bin/fst.cgi' failed [Sat Oct 22 02:56:45 2011] [error] [client127.0.0.1]スクリプトヘッダーの早期終了:fst.cgi
私のスクリプトは
#!/usr/bin/Perl
print "Content-type:text/html\n\n";
print "hello world";
ファイルのアクセス許可を設定しました...
また、ファイルApache.conf
に次の行を追加しました。
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory /usr/lib/cgi-bin/>
Options +ExecCGI
</Directory>
AddHandler cgi-script .cgi .pl
しかし、それでも同じエラーが表示されます。考えられるすべての変更を行いましたが、成功しませんでした...
/ var/log/Apache2/error_logで見つかったのと同じエラーが発生しました。私はついに、Perlスクリプトが(Parallels仮想マシンを介して)Windowsシステムから直接コピーされたことに気付きました。Windowsのキャリッジリターン「\ r\n」がこのエラーの原因であるようです。
ASCIIモードを使用してこのPerlスクリプトをWindowsからMacにFTPで転送して "\ r\n"を "\ r"に自動的に変換すると、同じPerlスクリプトが変更なしで正しく機能します。
同じ問題が何度か発生しました。ファイル内のShebangを次のように変更してみてください。
#!/usr/bin/Perl -w
なぜこれがスクリプトを実行させるのか、私を打ち負かします...あなたが見つけたら私たちにも知らせてください。
「そのようなファイルまたはディレクトリはありません」というエラーメッセージは、ApacheまたはPerlからのものではありません。 Apacheがスクリプトを呼び出すと、システムのコマンドラインインタープリター(CLI)に実行が渡されます。このCLIはスクリプトファイルを開き、最初の行「#!/ usr/bin/Perl」(シバン行)を読み取ります。
Sam Tsengが詳しく説明したように、ファイルには明らかにWindowsの改行文字シーケンス「\ r\n」(16進コード:x0D x0A、記号:CR LF)が含まれています。これで、CLIインタープリターは「\ n」文字まで行を読み取ります。 CLIは「\ r」文字を認識しないため、パス「/ usr/bin/Perl \ r」の一部になり、改行の一部ではなくなります。
オプション '-w'でこの問題が修正されるのはなぜですか?
オプション「-w」を文字「\ r」よりも追加すると、引数「-w\r」の一部になります。 Perl実行可能ファイルへのパスは「/ usr/bin/Perl」にあり、「-w\r」がコマンドライン引数として渡されます。ただし、Perlは優れており、「-w\r」オプションを処理するときにエラーは発生しません。
同様のエラーが発生しました:(2)そのようなファイルまたはディレクトリはありません: '/ var/www/cgi-bin/aaa.py'の実行に失敗しました。そして、上記のような答えは解決できません。それから私はそれを見つけます:vim aaa.py :set ff
そしてファイルフォーマットはdosです。 :set ff=unix
とwqはすぐにそれを修正しました。
Windows環境内でファイルを作成するときに生成される「Windowsのキャリッジリターン」を削除する必要があります。
これはコマンドで簡単に実行できます
dos2unix fst.cgi fst.cgi
最初のfst.cgiは変換するファイルで、2番目は変換先のファイル名です。これは同じままにすることができます。
次のステップは、コマンドを実行することです
chmod 755 fst.cgi
これにより、ファイルのアクセス許可が上書きされ、ファイルを実行できるようになります。
幸運を
同じ問題でほぼ1日かかります。可能性を提供したいと思います。
私のPCとリモートサーバーOSはどちらもUbuntu 16.04です。そして、私は FileZilla を使用してPCからリモートサーバーにファイルを転送しています。 デフォルトの転送タイプはAutoに設定されています。これが私の場合の理由です。
解決策は、デフォルトの転送タイプをBinaryとして設定することです。そして、ナビゲーションパスは次のとおりです:編集->設定->設定->転送->ファイルタイプ->デフォルトの転送タイプ:
# su -c /usr/lib/cgi-bin/fst.cgi Apache
/usr/lib/cgi-bin
に755の権限があることを確認してください/usr/lib/cgi-bin/fst.cgi
に755の権限があることを確認してください