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に変更しました
シェルでうまく機能する場合、Apacheはchrootされていると思います。したがって、phpは/ var/...を見つけることができません。
または、httpdユーザーのユーザーに/ var/...を入力する権限がありません.
PHPが得意であれば。 Open dir/var/...そして、readdir()およびcheck dirが存在し、check fileが存在します。
この質問はあなたを助けるかもしれません。 opendir()で/ home /をスキャン
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サーバーを再起動しますが、これはセキュリティ上のリスクがあるためお勧めしません。
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に追加します。
問題は通常、PHP内からコードを実行すると、多くのLinuxディストリビューションでWebサーバーユーザーwww-dataとして実行されることです。通常、このユーザーには環境が設定されていません。そのため、PATHがありません。ファイルでフルパスを使用することにより、通常これを克服できます。
xxe.sh
/usr/bin/python /path/to/script/vin.py
ここですべてを試しましたが、何も機能しませんでした。最終的にそれを解決したのは、Shell_execの前に次のものを使用していたことです:
putenv('PATH=/usr/local/bin');
私は数時間この問題に巻き込まれました。
私は解決策を考えました。 1.スクリプトをpythonファイル "script.py"に移動し、このファイルをサーバールートに配置します。2. Shell_exec( "python script.py");
いずれにせよ、それは私のために動作します。
私のホストでは、Shell_exec()から実行されるphpファイルの別のパスを指定する必要がありました。これはShell_exec('/usr/bin/php backgroundtask.php');
では機能しませんでした。
これはShell_exec('/opt/php/php-5.5.0/bin/php backgroundtask.php');
でした。
このリファレンス。 にアクセスできます。
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回。