Aba*_*unt 103 php python linux exec archlinux
我正在尝试使用以下命令从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.7exec,shell_exec,system.但是,如果我跑
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
Run Code Online (Sandbox Code Playgroud)
它完美无缺,shutdown now而且什么都不做.
PHP具有访问和执行文件的权限.
编辑:感谢亚历杭德罗,我能够解决问题.如果您遇到同样的问题,请不要忘记您的网络服务器可能/希望不会以root用户身份运行.尝试以您的网络服务器用户或具有类似权限的用户身份登录,并尝试自行运行命令.
Ale*_*roz 141
在Ubuntu Server 10.04上测试.我希望它也可以帮助你在Arch Linux上.
在PHP中:
<?php
$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;
?>
Run Code Online (Sandbox Code Playgroud)
在Python文件中test.py,在第一行验证此文本:( 请参阅shebang说明):
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
Python文件也应具有正确的权限(如果PHP脚本在浏览器中运行或通过curl执行,则执行用户www-data/apache)和/或必须是"可执行"..py文件中的所有命令也必须具有正确的权限.
chmod +x myscript.py
Run Code Online (Sandbox Code Playgroud)
小智 21
我建议passthru直接使用和处理输出缓冲区:
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
Run Code Online (Sandbox Code Playgroud)
fif*_*nce 14
如果您想知道命令的返回状态并获得整个stdout输出,您可以实际使用exec:
$command = 'ls';
exec($command, $out, $status);
Run Code Online (Sandbox Code Playgroud)
$out是所有行的数组.$status是返回状态.对调试非常有用.
如果您还想查看stderr输出,可以使用proc_open或只是添加2>&1到您的$command.后者通常足以使工作更快并且"更快"地"实施".
小智 9
Alejandro钉了它,添加了对异常的澄清(Ubuntu或Debian) - 我没有代表添加到答案本身:
sudoers文件:
sudo visudo
例外情况:
www-data ALL=(ALL) NOPASSWD: ALL
就我而言,我需要在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!")
Run Code Online (Sandbox Code Playgroud)
从 php 我现在这样做:
$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);
Run Code Online (Sandbox Code Playgroud)
你应该看到:Hello World!
上面的方法看起来很复杂。使用我的方法作为参考。
我有这两个文件:
运行.php
目录
在这里,我创建了一个包含GO按钮的 HTML 页面。每当您按下此按钮时,都会在您提到的路径的目录中创建一个新文件夹。
运行.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";
}
?>Run Code Online (Sandbox Code Playgroud)
目录
#!/usr/bin/env python
import os
os.makedirs("thisfolder");
Run Code Online (Sandbox Code Playgroud)
根据情况明确使用哪个命令
exec() -执行外部程序
system() -执行外部程序并显示输出
passthru() -执行外部程序并显示原始输出
资料来源:http : //php.net/manual/en/function.exec.php
| 归档时间: |
|
| 查看次数: |
278752 次 |
| 最近记录: |