このトピックについていくつか質問があることはわかっていますが、私の問題を解決するものはないようです。 this または this または this を参照してください。
私はLinux、Fedora21を使用しており、ユーザーごとのディレクトリCGIスクリプトを有効にしようとしています。私は これら の指示に従いましたが、成功しませんでした。
エラーが発生します:
[cgi:error] End of script output before headers: test.cgi
test.cgi
は実行可能なshファイルで、非常に単純なスクリプトが含まれています。
#!/usr/bin/sh
echo "Content-type: text/plain"
echo ""
echo "Hello"
実行可能フラグがあり、シェルから問題なく実行されます。私もPythonで試しました:同じ結果。
また、適切な対策としてselinuxを無効にしました。
また、debug
レベルをApacheのErrorLogに設定してみましたが、取得できるのは、上記のエラーの前に「許可された」権限のみです。
/etc/httpd/conf.d/userdir.conf
ファイルも設定しました
<Directory "/home/*/public_html">
AllowOverride All
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require all granted
</Directory>
<Directory /home/*/public_html/cgi-bin/>
Options ExecCGI FollowSymLinks
SetHandler cgi-script
AddHandler cgi-script .cgi .exe .pl .py .vbs
Require all granted
AllowOverride All
</Directory>
サーバーを再起動しました。失敗。私には何も問題ないように見えますが、理解できません...何が問題なのですか?
問題がユーザーごとのディレクトリに関するものであることを追加するのを忘れていました。同じスクリプトを/var/www/cgi-bin
ディレクトリに移動すると、期待どおりに機能します。
シェルは存在します:
$ ls /usr/bin/sh
/usr/bin/sh
最後に私はそれを解決しました。 彼のコメント でSUEXECを指摘したので、@ JimBのおかげで、私は知らなかった(または単に今まで無視されていた)。
suEXECドキュメント を少し読んだ後、問題がそこになければならないことを理解しました。だから、私は設定を見ました:
# suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=1000
-D AP_HTTPD_USER="Apache"
-D AP_LOG_SYSLOG
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX="public_html"
すべてがOk(私のユーザーのuid/gid、userdir_suffixは問題ありません)のように見えました。そこで、システムログを調べました。
# journalctl -b | grep "suexec"
May 22 11:43:12 caladan suexec[5397]: uid: (1000/user) gid: (1000/user) cmd: test.cgi
May 22 11:43:12 caladan suexec[5397]: directory is writable by others: (/home/user/public_html/cgi-bin)
そしてそれが問題です:mycgi-bin
ディレクトリは他のユーザーによって書き込み可能でした。
権限を755
に変更するだけで修正しました。
私にとって、Shebangの行(#!/usr/bin/sh
)を#!/usr/bin/env sh
に変更するとうまくいきました。 推奨されるBashシバンは何ですか? からのシバン行が機能しているように見えました(ただし、sh
はbash
とは異なるため、sh
を使用する場合は、これに固執してください)。
したがって、このコードは私にとってうまくいきました:
#!/usr/bin/env sh
echo "Content-type: text/plain"
echo ""
echo "Hello"
また、上記の投稿によると、/usr/bin/env sh
は/bin/sh
よりも優先されているようです。ディレクトリごとのものについてはわかりません。
これは、他のPythonモジュールメソッドをcgiから(おそらくデバッグのために)残している可能性がある場所にあるモジュールモジュールのメソッドを呼び出そうとしたときに発生します。声明、これは時々問題を簡単に修正します。
コマンドラインから正常に実行されたPython 2.x CGIスクリプトの「ヘッダーの前のスクリプト出力の終了:myscript.py」というメッセージが表示されました。
問題は、それがコマンドラインからのものであったとしても、Webサーバーによって正しく実行されていなかったことであることが判明しました。システムがサーバーに返したエラーメッセージが何であれ、CGIヘッダーは渡されませんでした(例: "Content-Type:text/html\r\n\r\n")。したがって、このエラーメッセージ。
私にとって、それを修正することは Shebang を以下から変更することを意味しました:
#!/usr/bin/env python
よりシステム固有(ただし検証可能)に:
#!/usr/local/bin/python
おそらくあなたは同じような何かに遭遇しているでしょう。
(FreeBSD9.x。)
Apacheユーザーとしてスクリプトを実行してみてください。
これが発生する理由はいくつかあります。 @JimBはシバンの問題について言及しています。 @premganzは、Content-Type文字列が書き込まれる前に発生するデバッグ印刷ステートメントの問題について言及しています。私の場合、それはdb接続の失敗でした。他の問題である可能性があります。
これをデバッグする最良の方法は、Apacheユーザーとしてコマンドラインで直接スクリプトを実行し、どのようなエラーが発生するかを確認することです。
Apacheユーザーとしてスクリプトを実行する方法
Apache2を実行していて、Apacheユーザーがwww-dataで、cgiスクリプトが/myapp/myreport.pyであるとすると、次のようになります。
デフォルトのシェルを変更して、www-dataユーザーとしてログインできるようにします。/etc/passwdを編集します(一時的に)
Sudo su -
cd /etc
cp -p passwd passwd.2017-10-22
emacs passwd # edit file - use your favorite editor
変化する:
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
に:
www-data:x:33:33:www-data:/var/www:/bin/bash
Www-dataユーザーとしてログインします。
Sudo su - www-data
環境変数を設定します。 Apache SetEnvステートメントをエクスポートステートメントに変換します。私の場合、Apacheの設定ディレクトリの設定にはこれらの変数が設定されています
SetEnv PYTHONPATH /myapp/lib
SetEnv VCONF /myapp/conf/prod.yaml
として実行する
export PYTHONPATH=/myapp/lib
export VCONF=/myapp/conf/prod.yaml
次に、CGIスクリプトを試してください
cd /myapp
./myreport.py
Apacheで発生しているエラーが表示されます。それらを修正します。
Www-dataユーザーのデフォルトのシェルを/ usr/sbin/nologinに戻します。
ファイルownerだけがcgiスクリプトへの書き込み権限を持ち、groupは持たないようにします。つまり、-rwxr-xr-x
ではなく-rwxrwxr-x
。
ユーザーディレクトリでは、多くの場合、グループは個人ユーザーグループであり、ユーザーだけがメンバーになっていますが、Apacheはg + wビットを使用することに神経質になりますが、これに関するやや偽のエラーメッセージ。
このエラーは、古い方法で印刷を使用すると発生します。
print 'your test'
それ以降のバージョンのPythonのはずです。
print ('your test')
Userdirでpython cgiを実行すると問題が発生しました。
/ var/log/httpd/error_logは以下を明らかにします:
[Fri Apr 26 13:09:41.840285 2019] [cgi:error] [pid 25421] [client 98.234.206.134:60837]ヘッダーの前のスクリプト出力の終わり:index.cgi
URLで呼び出されているユーザーはdoug、ユーザー42、グループ42でした。
私は漠然と、suexecが1000未満のグループまたはユーザーのcgiスクリプトの実行に問題があることを思い出しました。
そこで、user1kという新しいグループを1000として作成しました。次に、
adduser -g 1000 -u 1000 dwg
chmod 755 /home/dwg
mkdir /home/dwg/public_html
そして、python cgiスクリプトをこのディレクトリに配置しました。
グループとユーザーが1000以上になったため、スクリプトは正しく実行され始めました。問題を修正したのがユーザーなのかグループなのかはわかりませんが、どちらを変更しても問題は解決しました。
注:問題となったのは、ユーザーIDが1000未満であることです。したがって、userdir cgi executeeのuserIDが> 999になるようにします。
以下はman suexec
出力からの抜粋です。
ターゲットユーザーIDは最小ID番号より上ですか?最小ユーザーID番号は、構成時に指定されます。これにより、CGI/SSIプログラムの実行を許可される最低限のユーザーIDを設定できます。これは、「システム」アカウントをブロックするのに役立ちます。
ターゲットグループIDは最小ID番号より上ですか?最小グループID番号は、構成時に指定されます。これにより、CGI/SSIプログラムの実行が許可される最低限のグループIDを設定できます。これは、「システム」グループをブロックするのに役立ちます。