PHPから.shスクリプトを実行しようとしていますが、実行されていません。
エラーログを確認したところ、「sh:Permission denied」エラーが発生しています。 phpが実行されているユーザーを確認したところ、Apacheユーザーで実行されていました。
.shの所有権をApacheユーザーに変更してみましたが、結果はありません。
最初はスクリプトがwww/dirの外にあるためだと思っていましたが、同じディレクトリにスクリプトを配置しても、エラーが発生しています。
ApacheユーザーをSUDOersリストに追加する以外に、これに対する解決策はありますか?
'php filename.php'コマンドを使用してPuTTYから起動すると、shスクリプトは正常に実行されます。
次の提案を試してください。
php -r "echo exec('whoami');"
r-x
フラグの権限があることを確認してください:chmod 755 dir; chmod 755 file
+s
フラグ(Sudo)をファイルに追加してみてください(非推奨):chmod u+s file
、safe_mode
で実行されていないことを確認してください。include_path
に追加します。例:php.ini
ファイル:include_path ".:/usr/local/lib/php:/your/dir"
.htaccess
ファイル:php_value include_path ".:/usr/local/lib/php:/your/dir"
/bin/sh
)(例:finger
で確認してください)。php.ini
がexec
関数に対してdisable_functions
を使用していないことを確認してくださいselinux-utils
をインストールしている場合(セキュリティが強化されたLinuxシステム)、 @ Tonin 回答の説明に従ってgetenforce
/setenforce
の設定を確認してください。php.ini
またはhttpd.conf
ファイルを変更した場合は、Webサーバーを再起動することを忘れないでください。php.ini
のすべての種類のエラー(display_error
、error_reporting
など)で有効にします。このような問題は、使用するOSとその構成方法によって異なる場合があります。一部のLinuxディストリビューション(主にCentOSやFedoraのようなRHELベースのディストリビューション)には、デフォルトでSELinuxがアクティブになっています。これは、次のコマンドで確認および一時的に変更できます。
root@ls:~# /usr/sbin/getenforce
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce
Permissive
次のコマンドを使用して、現在の構成をより完全に表示することもできます。
root@ls:~# /usr/sbin/sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted
この変更を永続的にするには、/etc/selinux/config
ファイルを編集し、SELINUX
変数をpermissive
またはdisabled
に設定します。
しかし、この種の問題を解決する正しい方法は、本当にこの状況にある場合、/var/log/audit/audit.log
ログファイルを確認することです。 SELinuxルールに関連するすべてのイベントが含まれます。その後、おそらくスクリプトに正しいコンテキストを与える必要があります。つまり、Apache/phpユーザーによる実行が許可されます。 SELinuxセキュリティコンテキストのチェックはls -Z
で行われます:
root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t ..
これは、各ファイル/ディレクトリのユーザー、役割、およびタイプをリストします。ここで、httpd_sys_script_exec_t
タイプは、cgiディレクトリ内のファイルにhttpdによって実行される許可を与えます。シェルスクリプトはおそらく同じタイプである必要があります。
audit.log
行をaudit2allow
コマンドにフィードすることもできます。 SELinuxを幸せにするために必要な変更が出力されます。しかし、通常、提案された変更はSELinuxポリシー自体で行う必要があります。これは、ケースで行うべきではないことです(ただし、この出力は、何が起こっているのかについての手掛かりを与える可能性があります)。
次のページでは、同様の問題とそれを解決するさまざまな方法について説明します。 http://sheltren.com/stop-disabling-selinux
そこで、Googleで同様の問題を検索したところ、ここにたどり着きました。 SELinuxについてのコメントが私を正しい方向に向かわせたと私は思いもしませんでした。
私自身のケースでは、シェルコマンドを使用するカスタムGitデプロイスクリプトを使用していました。このコマンドはBASHでは問題なく動作しますが、Gitでは「アクセスが拒否されました」、「リポジトリではありません」。これは本当に奇妙で、私がこの答えに出くわすまで、私は複数の修正を行いました。
root@ls:~# /usr/sbin/setenforce Permissive
問題を解決しました。
私の状況は少し異なりますが、Googleがここに連れて行ってくれたので、共有したいと思いました...
私のサーバーはdebian stableを実行していて、シェルスクリプトを実行しようとすると1回は機能しましたが、権限は自動的に644に変更され、スクリプトを実行する次の試行はPermission denied
になりました。それは私にとってはSambaサーバーの問題であることがわかり、今までそのパターンに気付きませんでした。
QA WindowsエディターからSambaパーティションにファイルを保存すると、奇妙な権限が変更されます が修正されました。 samba共有を10年間使用した後でも、map archive = no
オプションについて知りませんでした。
WindowsデスクトップでNotepad ++を使用すると、umaskが設定されているため、ターゲットファイルの権限が775ではなく675に変更されます。