web-dev-qa-db-ja.com

ユーザーディレクトリのApache CGI「ヘッダーの前のスクリプト出力の終わり」

このトピックについていくつか質問があることはわかっていますが、私の問題を解決するものはないようです。 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ディレクトリに移動すると、期待どおりに機能します。

編集2:

シェルは存在します:

$ ls /usr/bin/sh
/usr/bin/sh
6
AkiRoss

最後に私はそれを解決しました。 彼のコメント で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に変更するだけで修正しました。

7
AkiRoss

私にとって、Shebangの行(#!/usr/bin/sh)を#!/usr/bin/env shに変更するとうまくいきました。 推奨されるBashシバンは何ですか? からのシバン行が機能しているように見えました(ただし、shbashとは異なるため、shを使用する場合は、これに固執してください)。

したがって、このコードは私にとってうまくいきました:

#!/usr/bin/env sh
echo "Content-type: text/plain"
echo ""
echo "Hello"

また、上記の投稿によると、/usr/bin/env sh/bin/shよりも優先されているようです。ディレクトリごとのものについてはわかりません。

3
jkd

これは、他のPythonモジュールメソッドをcgiから(おそらくデバッグのために)残している可能性がある場所にあるモジュールモジュールのメソッドを呼び出そうとしたときに発生します。声明、これは時々問題を簡単に修正します。

2
premganz

コマンドラインから正常に実行された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。)

1
JimB

Apacheユーザーとしてスクリプトを実行してみてください。

これが発生する理由はいくつかあります。 @JimBはシバンの問題について言及しています。 @premganzは、Content-Type文字列が書き込まれる前に発生するデバッグ印刷ステートメントの問題について言及しています。私の場合、それはdb接続の失敗でした。他の問題である可能性があります。

これをデバッグする最良の方法は、Apacheユーザーとしてコマンドラインで直接スクリプトを実行し、どのようなエラーが発生するかを確認することです。

Apacheユーザーとしてスクリプトを実行する方法

Apache2を実行していて、Apacheユーザーがwww-dataで、cgiスクリプトが/myapp/myreport.pyであるとすると、次のようになります。

  1. デフォルトのシェルを変更して、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
    
  2. Www-dataユーザーとしてログインします。

    Sudo su - www-data
    
  3. 環境変数を設定します。 Apache SetEnvステートメントをエクスポートステートメントに変換します。私の場合、Apacheの設定ディレクトリの設定にはこれらの変数が設定されています

    SetEnv PYTHONPATH /myapp/lib
    SetEnv VCONF /myapp/conf/prod.yaml
    

    として実行する

    export PYTHONPATH=/myapp/lib
    export VCONF=/myapp/conf/prod.yaml
    
  4. 次に、CGIスクリプトを試してください

    cd /myapp
    ./myreport.py
    
  5. Apacheで発生しているエラーが表示されます。それらを修正します。

  6. Www-dataユーザーのデフォルトのシェルを/ usr/sbin/nologinに戻します。

1
dlink

ファイルownerだけがcgiスクリプトへの書き込み権限を持ち、groupは持たないようにします。つまり、-rwxr-xr-xではなく-rwxrwxr-x

ユーザーディレクトリでは、多くの場合、グループは個人ユーザーグループであり、ユーザーだけがメンバーになっていますが、Apacheはg + wビットを使用することに神経質になりますが、これに関するやや偽のエラーメッセージ。

1
pst

このエラーは、古い方法で印刷を使用すると発生します。

print 'your test'

それ以降のバージョンのPythonのはずです。

print ('your test')
0
Amit Garg

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を設定できます。これは、「システム」グループをブロックするのに役立ちます。

0
Douglas Goodall