web-dev-qa-db-ja.com

php Shell_exec()コマンドが機能しない

Phpから.shファイルを実行しようとしています。 Shell_exec()で試しました。しかし、動作しませんスタックオーバーフローでこれに関連する多くの質問を参照しましたが、解決できませんでした

私のPHPコードは(web.php)です

    <?php
    echo Shell_exec('/var/www/project/xxe.sh');
    echo "done";
    ?>

doneのみが印刷されます。しかし、それは端末から動作しています(php /var/www/project/web.php)

Xxe.shでは、pythonファイルを呼び出しています

    python vin.py

また、両方の.sh n .pyファイルのファイル許可を777に変更しました

16
user3018038

シェルでうまく機能する場合、Apacheはchrootされていると思います。したがって、phpは/ var/...を見つけることができません。

または、httpdユーザーのユーザーに/ var/...を入力する権限がありません.

PHPが得意であれば。 Open dir/var/...そして、readdir()およびcheck dirが存在し、check fileが存在します。

この質問はあなたを助けるかもしれません。 opendir()で/ home /をスキャン

4
Jason Heo

Apacheではなく端末で動作すると言う場合、Apacheの_php.ini_ファイルはShell_exec()の使用を無効にしている可能性があります。

http://www.php.net/manual/en/ini.core.php#ini.disable-functions を参照してください

Apacheの_php.ini_ファイルは次のようになります

_disable_functions=exec,passthru,Shell_exec,system,proc_open,popen
_

このリストから_Shell_exec_を削除し、Webサーバーを再起動しますが、これはセキュリティ上のリスクがあるためお勧めしません。

5
SamV

Github post-receive webhookによってトリガーされるスクリプトを実行しようとしているとき。

ここに私のプロジェクトディレクトリがあります(クローンgitリポジトリ):

/var/www/html/my-repo

上記のディレクトリ内にwebhook.phpというスクリプトを作成します。

<?php
#webhook.php

$cmd = Shell_exec("git pull 2>&1");

#for debugging
echo $cmd;
?>

/ var/www/html内で次のコマンドを実行します

Sudo chown www-data:www-data -R my-repo/

http://www.myserver.com/my-repo/webhook.php にアクセスしてテストします

スクリプトへのパスをgithub webhookに追加します。

3
Jack

問題は通常、PHP内からコードを実行すると、多くのLinuxディストリビューションでWebサーバーユーザーwww-dataとして実行されることです。通常、このユーザーには環境が設定されていません。そのため、PATHがありません。ファイルでフルパスを使用することにより、通常これを克服できます。

xxe.sh

/usr/bin/python /path/to/script/vin.py
1
Jesper Blaase

ここですべてを試しましたが、何も機能しませんでした。最終的にそれを解決したのは、Shell_execの前に次のものを使用していたことです:

putenv('PATH=/usr/local/bin');
1

私は数時間この問題に巻き込まれました。

私は解決策を考えました。 1.スクリプトをpythonファイル "script.py"に移動し、このファイルをサーバールートに配置します。2. Shell_exec( "python script.py");

いずれにせよ、それは私のために動作します。

1
xchangcheng

私のホストでは、Shell_exec()から実行されるphpファイルの別のパスを指定する必要がありました。これはShell_exec('/usr/bin/php backgroundtask.php');では機能しませんでした。

これはShell_exec('/opt/php/php-5.5.0/bin/php backgroundtask.php');でした。

このリファレンス。 にアクセスできます。

0
lastlink

PHPバックスラッシュ。

PHPはバックスラッシュをエスケープするため、シェルに到達するコマンドは

'COPY E:path1\path2\file.prn /B \127.0.0.1\"PRINTER NAME"'

だから私はこのようなコマンドを与えました

'COPY E:\\path1\\path2\\file.prn /B \\\\127.0.0.1\"PRINTER NAME"'. 

バックスラッシュを二重にエスケープする必要があります:PHPに1回、シェルに1回。

0
Nithiyakumar K