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でプログラムを実行するにはどうすればよいですか?
Apacheのユーザー_www-data
_には、Sudo
を使用して特定のアプリケーションを実行する権限を付与する必要があります。
Sudo visudo
_を実行します。実際には、ファイルを_etc/sudoers
_で編集します。これを行うには、ターミナルで_Sudo visudo
_を使用して、編集する複製(temp)sudoers
ファイルを編集します。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
PHPバイナリへの完全なパスを指定してみてください。例:/usr/bin/php
わからない場合は、which php
通常、whoami
、ls
、php
などのアプリケーションへのフルパスを指定する必要があります。プログラムの場所(完全なパス)がわからない場合は、次のように確認できます。
$ type php
php is /usr/bin/php
次に、スクリプトでそのように指定します。
<?php
echo Shell_exec("/usr/bin/php ....bla bla bla");
?>
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 =
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
_/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を無効にし、問題が存在するかどうかを確認します。
修正するには-適切なマニュアルを読み、ケースの書き込み許可ルールを修正します。
私にとって最も簡単な方法は、php.ini内に移動して、次で始まる行にコメントを付けることでした。
disable_functions