7

PHPのexec()関数に問題があります。特定の関数を呼び出していないようです。たとえば、コードecho exec('ls');は何も出力しません(ディレクトリにファイルがあるはずです)。これが私にとって問題である主な理由は、PHPのexec()呼び出しから.jarを実行しようとしていることです。

私の知る限り、Javaプログラムを正しく呼び出していますが、出力が得られません。.jarは、サーバーのコマンドラインから実行できます。(記録のために、それはApacheサーバーです)。

.jar実行用の私のphpは次のようになります。

$output = array();
exec('java -jar testJava.jar', $output);
print_r($output);

このexec()呼び出しから出力を取得するのは。だけですArray()

exec()の実行'whoami'と。で成功しまし'pwd'た。一部の機能が機能している理由と機能していない理由がわかりません。私もPHPの経験が豊富ではないので、問題の診断方法がよくわかりません。ありとあらゆる助けをいただければ幸いです。

4

5 に答える 5

4

lsを実行できない理由は、権限が原因です。

WebサーバーをユーザーAとして実行している場合は、ユーザーAのアクセス許可を持つディレクトリのみをlsできます。

ディレクトリの権限を変更するか、httpd.confファイルを変更してサーバーを実行しているユーザーを変更できます(apacheを使用していると想定しています)。

ディレクトリのアクセス許可を変更する場合は、親ディレクトリのアクセス許可も変更するようにしてください。

Webサーバーのユーザーを変更するには、次の手順に従います。

次のファイルを開きます。

vi /etc/httpd/conf/httpd.conf

検索する

User apache
Group apache

ユーザー名とグループ名を変更します。ユーザーとグループを変更した後、次のコマンドを使用してサーバーを再起動します。

/sbin/service httpd restart

その後、そのユーザーが実行できるすべてのコマンドを実行できるようになります。

編集:

'User'は、httpd.confのroot以外のユーザーである必要があります。デフォルトでは、Apacheはrootとして実行されたときにページを提供しません。ユーザーをroot以外のユーザーとして設定する必要があります。そうしないと、エラーが発生します。apacheを強制的にrootとして実行する場合は、次のように環境変数を設定する必要があります。

env CFLAGS=-DBIG_SECURITY_HOLE

次に、ルートとして実行する前に、apacheを再構築する必要があります。

于 2012-06-23T22:00:40.380 に答える
3

私は問題を発見しました-SELinuxはPHPが特定の関数にアクセスするのをブロックしていました。SELinuxをパーミッシブモードにすると、問題が修正されました(ただし、SELinuxをパーミッシブモードのままにする必要はありません。可能であれば、特定の機能を許可する方法を見つけたいと思います)。

于 2012-06-26T19:56:39.747 に答える
3

私には解決策があります:コマンドはコンソールから実行されますが、exec / system/passthruを介してphpからは実行されません。問題はコマンドへのパスです。コマンドへの絶対パスで動作します

となることによって:

wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"

になります:

/usr/local/bin/wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"

そして今、それはexecを介してphpから動作しますここでコマンドバイナリを介して見ることができますwhereis wkhtmltopdf

于 2014-07-04T08:24:08.027 に答える
2

PHP execがコマンドラインからは機能するがApacheからは機能しない理由を理解しようとして、髪の毛を引き裂きました。最後に、次の権限を見つけました。

***getsebool -a | grep httpd*** ----> 
    **httpd_setrlimit --> off
    httpd_ssi_exec --> off
    httpd_sys_script_anon_write --> off**

使用: setsebool -P httpd_ssi_exec 1

参照:https ://linux.die.net/man/8/httpd_selinux

于 2018-09-30T02:26:34.480 に答える
-1

問題は実行の問題ではなく、execコマンドの構文です。2番目の引数は常に配列として返され、各インデックスに1行の出力が含まれます。exec関数の戻り値には、コマンド出力の最終行が含まれます。使用できる出力を表示するには、次のようにします。

foreach($ output as $ line)echo "$ line \ n";

詳細については、 http://php.net/manual/en/function.exec.phpを参照してください。3番目の引数を使用してコマンドの終了値を取得することもできます。

于 2013-05-23T08:52:12.683 に答える