web-dev-qa-db-ja.com

PHPスクリプトはbashスクリプトを実行できません。sh:権限が拒否されました

PHPから.shスクリプトを実行しようとしていますが、実行されていません。

エラーログを確認したところ、「sh:Permission denied」エラーが発生しています。 phpが実行されているユーザーを確認したところ、Apacheユーザーで実行されていました。

.shの所有権をApacheユーザーに変更してみましたが、結果はありません。

最初はスクリプトがwww/dirの外にあるためだと思っていましたが、同じディレクトリにスクリプトを配置しても、エラーが発生しています。

ApacheユーザーをSUDOersリストに追加する以外に、これに対する解決策はありますか?

'php filename.php'コマンドを使用してPuTTYから起動すると、shスクリプトは正常に実行されます。

15
Robin Presto

次の提案を試してください。

  • 以下のテストコマンドを実行して、それが機能するかどうかを確認します。
    • php -r "echo exec('whoami');"
  • すべての親ディレクトリとファイルに少なくともr-xフラグの権限があることを確認してください:
    • chmod 755 dir; chmod 755 file
  • ファイルの所有者があなたの Apacheユーザー 。であることを確認してください。
    • また、+sフラグ(Sudo)をファイルに追加してみてください(非推奨):
      • chmod u+s file
  • PHPが safe_mode で実行されていないことを確認してください。
  • スクリプトがApacheルート内にあることを確認してください:
    • それ以外の場合は、スクリプトをその中に移動します。
    • または、そのディレクトリをApache構成に追加します。
    • または、このディレクトリをinclude_pathに追加します。例:
      • php.iniファイル:include_path ".:/usr/local/lib/php:/your/dir"
      • または .htaccess ファイル:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • シェルがApacheユーザーに対して有効に設定されているかどうかを確認します(例:/bin/sh)(例:fingerで確認してください)。
  • php.iniexec関数に対してdisable_functionsを使用していないことを確認してください
  • SELinuxを使用している場合、またはselinux-utilsをインストールしている場合(セキュリティが強化されたLinuxシステム)、 @ Tonin 回答の説明に従ってgetenforce/setenforceの設定を確認してください。

トラブルシューティング:

  • php.iniまたはhttpd.confファイルを変更した場合は、Webサーバーを再起動することを忘れないでください。
  • 詳細については、Apacheエラーログを確認してください。
  • php.iniのすべての種類のエラー(display_errorerror_reportingなど)で有効にします。
11
kenorb

このような問題は、使用する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

13
Tonin

そこで、Googleで同様の問題を検索したところ、ここにたどり着きました。 SELinuxについてのコメントが私を正しい方向に向かわせたと私は思いもしませんでした。

私自身のケースでは、シェルコマンドを使用するカスタムGitデプロイスクリプトを使用していました。このコマンドはBASHでは問題なく動作しますが、Gitでは「アクセスが拒否されました」、「リポジトリではありません」。これは本当に奇妙で、私がこの答えに出くわすまで、私は複数の修正を行いました。

root@ls:~# /usr/sbin/setenforce Permissive問題を解決しました。

1
Bade Adesemowo

私の状況は少し異なりますが、Googleがここに連れて行ってくれたので、共有したいと思いました...

私のサーバーはdebian stableを実行していて、シェルスクリプトを実行しようとすると1回は機能しましたが、権限は自動的に644に変更され、スクリプトを実行する次の試行はPermission deniedになりました。それは私にとってはSambaサーバーの問題であることがわかり、今までそのパターンに気付きませんでした。

QA WindowsエディターからSambaパーティションにファイルを保存すると、奇妙な権限が変更されます が修正されました。 samba共有を10年間使用した後でも、map archive = noオプションについて知りませんでした。

WindowsデスクトップでNotepad ++を使用すると、umaskが設定されているため、ターゲットファイルの権限が775ではなく675に変更されます。

0
Chris K