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


14

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

エラーログを確認しましたが、「sh:Permission denied」エラーが表示されています。どのユーザーphpが実行されているかを確認し、apacheユーザーの下で実行されました。

.shの所有権をapacheユーザーに変更しようとしましたが、結果はありません。

これは、最初はスクリプトがwww / dirの外にあるためだと考えましたが、同じディレクトリにスクリプトを配置しても、エラーが表示されたままです。

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

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


3
それはシェルスクリプトですか、それともPHPファイルですか?あなたの最後の段落はそれについて明確ではありません。また、xファイルに実行許可()を設定しましたか?シェバン行でスクリプトインタープリターを指定しましたか?
ダニエルベック

PHPから実行するbashスクリプトです。はい、実行可能ファイルにし、スクリプトインタープリターを指定しました。puttyからPHPスクリプトを実行すると正しく動作し、bashスクリプトが呼び出されて正しく実行されます。しかし、代わりにwebbrowserからphpスクリプトを実行すると、bashスクリプトの実行に失敗し、パテで使用するユーザーではなくapacheユーザーとして実行されるため、このエラーが発生します。
ロビンプレスト

1
試してくださいchmod 775 yourscript.sh。これr-xにより、そのファイルの「他の」ユーザーにアクセス権が与えられます(読み取りおよび実行)。
リューク

私はそれを試してみました。運がありません。明日まで正確な理由はわかりません。自分の場所からログにアクセスできません。皆さんに返事します。ご協力ありがとうございました。:)
ロビンプレスト

回答:


10

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

  • 以下のテストコマンドを実行して、動作するかどうかを確認してください。
    • 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"
  • /bin/shApacheユーザーに対してシェルが有効に設定されているかどうかを確認します(例:)finger
  • php.ini使用しないようにしてください:disable_functionsfor execfunction
  • SELinuxを使用しているか、selinux-utilsインストール済み(セキュリティが強化されたLinuxシステム)の場合は、@ Toninの回答で説明されているようにgetenforce/ setenforce構成を確認してください。

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

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

1
それが私の問題でした。親ディレクトリに実行権がありませんでした...今は動作します!ありがとうございました!:)
ロビンプレスト

それでも私には運がありません:(何か提案はありますか? `` `[root @ kiwi tmp]#ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x.27 root root 4096 Sep 3 12:31 / drwxrwxrwt。4 root root 4096 Sep 3 15:45 / tmp -rwxr-xr-x。1 root root 24 Sep 3 15:39 / tmp / sleep safe_mode = Off include_path = "/ tmp:/ home / kiwi_build" `''
pihentagy

1
ああ、setenforceがそれを解決しました。OMG
pihentagy

13

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


詳細な返信ありがとうございます!悲しいかな、私が言ったように、明日までルートにアクセスできません。だから私もあなたに戻ります!:)はい、私はCentOSを使用しています。
ロビンプレスト

私はあなたの答えがとても気に入りました!残念ながら、私はあなたのものを選びませんでした。なぜなら、強制は無効にされ、問題ではなかったからです。私はあなたの答えから多くを学びましたが、ありがとうございます。十分な評判が得られたら投票します:)
ロビンプレスト

私の投稿から学んだことを知ってうれしい!
トニン

getenforcedが問題である場合、一体何が起こっているのかは本当に明らかではありません。それは私の一日を救った!
pihentagy

1

Googleで同様の問題を検索した後、ここに来ました。SELinuxについてのコメントが正しい方向を示しているとは思いませんでした。

私の場合、シェルコマンドを使用するカスタムGitデプロイスクリプトを使用していました。このコマンドはBASHでは正常に機能しますが、Gitでは「許可が拒否されました」および「リポジトリではありません」と表示されます。これは本当に奇妙で、この答えにつまずくまで複数の修正を行いました。

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


0

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

私のサーバーはdebian安定版を実行しており、シェルスクリプトを実行しようとすると1回動作し、その後アクセス許可が自動的に644に変更され、スクリプトを実行する次の試行が取得されましたPermission denied。それは私にとってsambaサーバーの問題であることが判明し、今までこのパターンに気づいていませんでした。

WindowsエディターからSambaパーティションにファイルを保存すると、 QA Strangeパーミッションが変更されましたmap archive = no10年もの間、Samba共有を使用した後でも、このオプションについては知りませんでした。

WindowsデスクトップでNotepad ++を使用すると、ターゲットファイルのアクセス許可が、umaskのセットアップ時に775ではなく675に変更されます。


-7

Apacheを介してPHPでルートコマンドを実行する

PHP関数内でrootとしてシェルコマンドを実行する必要があるWebアプリケーションがあり、それはかなり簡単だと思うでしょう...それ。これはApacheを実行しているLinuxシステム上にあり、「shell_exec」内の「sudo」を使用してコマンドを実行します。

主なことは、/ etc / sudoersファイルを編集することです。通常、「root」として「visudo」コマンドを使用して編集できます。

Apacheがコマンドを実行できること、およびパスワードを要求しないことを確認します。

apache  ALL=(ALL)       NOPASSWD: ALL

次に、この行をコメントアウトする必要があります。

#Defaults    requiretty

そうしないと、/ var / log / secureに次のエラーが表示されます。「申し訳ありませんが、sudoを実行するにはttyが必要です」。これで準備が整いました。PHPコードは簡単です。

$ results = shell_exec( 'sudo date');


5
これはひどい考えです。Apacheのインストールが危険にさらされたり、実行中のアプリケーションが危険にさらされたりすると、ハッカーはシステムへの完全なアクセス権を非常に簡単に取得してしまいます。正しいことは、広く開いたものを放置しないで、スクリプトに変更権限にある
ジャーニーマンオタク

2
Apacheユーザー/ロールにすべての権限を付与することに関する明らかなセキュリティ上の懸念のため、この回答に対して下票を発行する義務があると感じています。
ラムハウンド

@JourneymanGeek「if」ではなく、インストールが危険にさらされるときです。
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.