PHPからPythonスクリプトを実行する


114

次のコマンドを使用して、PHPからPythonスクリプトを実行しようとしています。

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

ただし、PHPは出力を生成しません。エラー報告はE_ALLに設定され、display_errorsはオンです。

これが私が試したものです:

  • 私が使用されpython2/usr/bin/python2そしてpython2.7代わりに/usr/bin/python2.7
  • また、絶対パスの代わりに相対パスを使用したため、何も変更されませんでした。
  • 私は、コマンドを使用してみましたexecshell_execsystem

ただし、実行すると

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

shutdown now何もしなくても完璧に機能します。

PHPには、ファイルにアクセスして実行する権限があります。

編集:アレハンドロのおかげで、問題を解決することができました。同じ問題が発生する場合は、Webサーバーがrootとして実行されていない可能性があることをお忘れなく。ウェブサーバーのユーザーまたは同様の権限を持つユーザーとしてログインして、自分でコマンドを実行してみてください。


最初の訪問この問題のstackoverflow.com/questions/21659637/...固定し、あなたが輸入またはTTYあるいは全くaskpassパッケージが動作しませんで立ち往生している場合は、場合のような問題を取得しない場合は、それを実行するための詳細手順については、このリンクをチェックしてください。stackoverflow.com/a/57978771/9470457ありがとうございます!!!
3rdi

回答:


159

Ubuntu Server 10.04でテスト済み。Arch Linuxでもお役に立てば幸いです。

PHP ではshell_exec関数を使用します

シェルを介してコマンドを実行し、完全な出力を文字列として返します。

実行されたコマンドからの出力、またはエラーが発生した場合やコマンドが出力を生成しなかった場合はNULLを返します。

<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

Pythonファイルでtest.py、このテキストを最初の行で確認します(shebangの説明を参照)

#!/usr/bin/env python

また、Pythonファイルには適切な権限(PHPスクリプトがブラウザーまたはcurlで実行されている場合はユーザーwww-data / apacheの実行)が必要であり、「実行可能」である必要があります。また、.pyファイルへのすべてのコマンドには、正しい特権が必要です。

撮影したPHPのマニュアルから

unixタイプのプラットフォームでshell_execを使用しようとしていて、動作するようには見えない人のための簡単な注意です。PHPはシステム上のWebユーザー(通常はApacheの場合はwww)として実行されるため、shell_execコマンドで使用するすべてのファイルまたはディレクトリに対する権限がWebユーザーにあることを確認する必要があります。それ以外の場合は、何も実行していないように見えます。

UNIXタイプのプラットフォームで実行可能ファイル作成するには

chmod +x myscript.py

6
ありがとうございました。もう1つの問題がありました。ApacheユーザーはPythonスクリプトでコマンドを実行できませんでしたが、sudoを使用してスクリプトの例外をsudoersファイルに追加することで修正できました。再度、感謝します!:)
放棄されたアカウント

1
私はApacheユーザーの同じ問題に直面しています、あなたは私をガイドしていただけますか?
2015

1
私はあなたの答えを使いました、それはpythonスクリプトをうまく実行しますが、ウェブページに何も表示されない結果をエコーすることができません。
Hamdi Charef

1
最初の行の「#!/ usr / bin / env python」が私にトリックをもたらしました。すごい!
C3PO 2018年

1
以下の場合:OSX echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");:またはecho shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
サイボーグ

23

passthru出力バッファーを直接使用して処理することをお勧めします。

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 

16

コマンドの戻りステータスを知り、stdout出力全体を取得したい場合は、実際に使用できますexec

$command = 'ls';
exec($command, $out, $status);

$out すべての行の配列です。 $status返品ステータスです。デバッグに非常に役立ちます。

stderr出力も確認したい場合は、proc_openを使用するか、単にに追加2>&1します$command。後者は、多くの場合、物事を機能させるのに十分であり、「実装」を高速化します。


8

Alejandroはそれを釘付けにし、例外を明確にしました(UbuntuまたはDebian)-回答自体に追加する担当者がいません。

sudoersファイル: sudo visudo

例外が追加されました: www-data ALL=(ALL) NOPASSWD: ALL


7
www-dataをsudoersに追加するのは効果的ではないようで、Apacheに必要なより多くの権限を与えます。実行中のスクリプトにwww-data権限を付与するだけで十分です。
JasonRDalton 2014

クールなアイデアですが、間違いなくシステムを脆弱にする可能性があります。@JasonRDaltonに同意します
リード


4

私の場合、というwwwディレクトリに新しいフォルダを作成する必要がありましたscripts。内scriptsに、という新しいファイルを追加しましたtest.py

次に、とを使用sudo chown www-data:root scriptsしましたsudo chown www-data:root test.py

次に、新しいscriptsディレクトリに移動して使用しましたsudo chmod +x test.py

私のtest.pyファイルは次のようになります。Pythonのバージョンが異なることに注意してください。

#!/usr/bin/env python3.5
print("Hello World!")

phpから今私はこれをします:

$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);

そして、あなたは見るべきです:Hello World!


3

上記の方法は複雑なようです。私の方法を参考にしてください。

次の2つのファイルがあります。

  • run.php

  • mkdir.py

ここでは、HTMLページを作成しました。 GOボタン。このボタンを押すたびに、パスを指定したディレクトリに新しいフォルダが作成されます。

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
	if(isset($_POST['GO']))
	{
		shell_exec("python /var/www/html/lab/mkdir.py");
		echo"success";
	}
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");

1

これは取るに足らないことですが、すでにアレハンドロの提案に従っていたが、このエラーが発生した人を助けたいだけです。

sh:blabla.py:コマンドが見つかりません

誰かがそのエラーに遭遇した場合、Alejandroによってphpファイルに少し変更を加える必要があります:

$command = escapeshellcmd('python blabla.py');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.