web-dev-qa-db-ja.com

Linux Ubuntuでのphp Shell_exec()権限

Linuxサーバーを使用してphpアプリケーションを開発しています。私の問題は、いくつかのexeファイルを呼び出すためにShell_exec()を実行することが機能しないことです(実際にはexeではなく、Linux実行可能ファイルの一種です)。

echo Shell_exec("whoami");

私はデーモンを得た

echo Shell_exec("ls")

ファイル名を取得しましたが

echo Shell_exec("php -v")

何もない、空白のページ

echo Shell_exec("php ....bla bla bla")

空白のページも。

端末(ユーザーhu)で入力すると、これらのコマンドはすべて機能します。私は数時間グーグルを検索しました、人々は許可のためにそれを言います。 Linuxの経験はありません。 PHPでプログラムを実行するにはどうすればよいですか?

13
ngoaho91

Apacheのユーザー_www-data_には、Sudoを使用して特定のアプリケーションを実行する権限を付与する必要があります。

  1. コマンド_Sudo visudo_を実行します。実際には、ファイルを_etc/sudoers_で編集します。これを行うには、ターミナルで_Sudo visudo_を使用して、編集する複製(temp)sudoersファイルを編集します。
  2. ファイルの最後に、次の例を追加します。-restart smokepingのコマンドとphpコマンドを使用して、質問の別のアクションを実行する場合は、

_www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php_

(これは、スーパーユーザー(root)特権を使用してrestartおよびphpコマンドを実行することを想定しています。また、_usr/bin/_パスでphpコマンドを使用します)

ただし、スーパーユーザー権限を使用してすべてのアプリケーションを実行する場合は、上記の代わりに次のコードを追加します。ALLコマンドではなく、そうしたくない場合があります。非常に危険です。

_www-data ALL=NOPASSWD: ALL
_

3。sudoersファイルを編集した後(visudoによってsudoersの一時ファイルを編集するため、一時ファイル(visudo)を保存して終了し、sudoersファイル。(_wq!_)

4.以上です。_Shell_exec_ script内で次のようにexec()または_xxx.php_を使用します。_Sudoコマンドの前にphpスクリプトで使用します

例:-

_exec ("Sudo /etc/init.d/smokeping restart 2>&1");
_

または

_Shell_exec("Sudo php -v"); 
_

だからあなたの問題では、あなたが使用したいコマンドをstep no (2.)に追加します。私が追加し、PHPスクリプトをあなたが望むように変更します。

ここにあなたと同じ問題があります https://stackoverflow.com/a/22953339/1862107

10

PHPバイナリへの完全なパスを指定してみてください。例:/usr/bin/php

わからない場合は、which php

5
Keiran Holloway

通常、whoamilsphpなどのアプリケーションへのフルパスを指定する必要があります。プログラムの場所(完全なパス)がわからない場合は、次のように確認できます。

$ type php
php is /usr/bin/php

次に、スクリプトでそのように指定します。

<?php
    echo Shell_exec("/usr/bin/php ....bla bla bla");
?>
4
slm

Php.iniは使用可能なコマンドセットを制限していますか?

これは私の/etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =
2
X Tian

Shell_execの問題をデバッグする方法

OK、ここに問題があります:ターミナルで機能するものと、phpのShell_exec(またはexec、spawnなど)で機能しないものがあります。あなたとphpの違いは何ですか?ここに3つあります:

PHPはHTTPサーバールールから実行されます

実際、ターミナルはyournameユーザーから実行され、phpは_www-data_から実行されます。したがって、最初のアイデアは_www-data_ユーザーからターミナルを開き、同じコマンドを試すことです。そう....

  • _/etc/passwd_ファイルを開き、_www-data_ユーザーの行を見つけて、ログインシェル(最後の1つ)を_/bin/false_(またはその他)から_/bin/bash_に変更します。
  • _www-data_のターミナルを開く:_su www-data_
  • Php -vまたはphpから実行できないものを試します。うまくいかない場合-Niceログが表示され、問題をデバッグできます。
  • 完了したら_/etc/passwd_ファイルを修正することを忘れないでください

PHPはPHPから実行されます

PHPは偏執狂的であり、Apache/nginxとphp.iniの設定には多くのオプションがあります。

これはデバッグが少し複雑です。ここには2つのオプションがあります。

  • ブラウザでログを有効にして、問題を確認します。 _php.ini_を編集し、_display_errors_および他のすべてのフラグをオンにして、ブラウザーでエラーを確認します。彼らはあなたがそれらを読んでデバッグすることができます。

  • _www-data_のシェルを取得し(最初のセクションを参照)、次のようなものを実行します

echo '<?php Shell_exec("php -v"); ?>' | php

コンソールで同じphpコードを実行し、エラーを確認してデバッグできます。

PHPはSELinux/apparmorから実行されます

Selinuxとapparmorは、アプリケーションが特定のアクション(たとえば、他のアプリケーションまたは特定の他のアプリケーションの起動)を実行することを禁止するセキュリティ機能です。サーバーで有効になっている可能性があります。

確認するには-selinux/apparmorを無効にし、問題が存在するかどうかを確認します。

修正するには-適切なマニュアルを読み、ケースの書き込み許可ルールを修正します。

2
Arenim

私にとって最も簡単な方法は、php.ini内に移動して、次で始まる行にコメントを付けることでした。

disable_functions
0
Alex