这很简单,但我根本无法工作。花了很多时间,我总是放弃。我创建了名为copy.php的php脚本,它应该调用一个名为copy.py的python脚本。
我想执行这样的命令行
<?php exec('/var/www/html/copy.py'); ?>
真的很简单。
为什么我不能从php exec()执行python脚本? python脚本中的函数是从另一个目录(Apache之外)获取error_log的副本到html目录。
如果我从终端
运行它 > php copy.php
它确实执行了该功能并制作了副本。为什么网络浏览器没有这样做?
让我简化一下:
为什么不能exec(“cp / var / log / httpd / error_log / var / www / html / path / to / php / script”)工作?
如果我在终端中键入它,但在浏览器中运行时不能正常工作。
答案 0 :(得分:1)
它不起作用的唯一原因是你没有设置写权限!
做:
sudo nano /etc/sudoers
然后提出以下内容:
www-data ALL=(root) NOPASSWD:ALL
答案 1 :(得分:0)
也许不同的设置适用于Apache环境与命令行。
使用error_reporting(E_ALL);
和ini_set('display_errors', true)
查看可能出现的错误。
可能禁止Apache环境使用exec
,或者Apache运行在对python脚本没有execute
权限的其他用户下运行。
答案 2 :(得分:0)
听起来像是一个权限错误。检查您的服务器是否以足够的权限运行。
echo exec('whoami');
将错误报告设置为全部报告:
ini_set('display_errors', true);
error_reporting(E_ALL);
并检查错误..
如果您的 whoami 返回的用户不是SU系列(linux)或管理员(Windows)的成员,请重新申请您的权限。
Linux中: 分配由whoami返回的用户运行python脚本的正确权限。不要允许生成的用户名以root用户身份运行,具有总管理权限。这是一个很大的不可能
答案 3 :(得分:0)
正如其他人所提到的,差异可能是权限。从命令行运行命令时,通常与运行apache脚本的用户不同。
换句话说,如果从命令行键入whoami
,您可能会得到您的用户帐户名称。
php中的echo exec('whoami');
显示脚本运行的对象,即Apache。
因此,您尝试从Web服务器运行的任何命令都无法以Apache用户身份运行。您提到您已经能够exec("python /usr/diskpurge/script.py")
工作,但没有exec('/var/www/html/copy.py')
没有。这是因为在一个实例中,您正在运行python,而在另一个实例中,您正在尝试执行copy.py
脚本。如果copy.py没有Apache用户的执行权限,那么您将无法从浏览器运行它。