PHP命令没有执行system(),exec()或passthru()

时间:2011-11-21 22:15:58

标签: php system exec passthru sudoers

我正在尝试使用开放式办公室运行命令行文件转换。

openoffice pdf filename.doc 2>&1

当我以root身份在命令行中执行时,它工作正常并且文件被转换。但是,当我在PHP文件中将上述命令作为apache用户传递时,它不会执行。

我尝试了所有三个PHP命令行执行:

$command_output=system($command_line,$rtnval);
$command_output=exec($command_line,$rtnval);
$command_output=passthru($command_line,$rtnval);

另外,

echo print_r($rtnval); 
echo print_r($command_output);

$rtnval返回1和$command_output 1.我很困惑,无法知道对上面命令传递的linux(centos)响应是什么。这非常令人沮丧,因为当我尝试执行命令时无法知道系统响应。

我还包含/etc/suders apache权限来运行open office命令。

  

apache ALL :(全部)NOPASSWD:/ path / to / openoffice

仍然没有在apache用户的PHP中执行该命令。

由于apache用户不执行此命令,我缺少什么?

3 个答案:

答案 0 :(得分:2)

可能是openoffice不在PATH中。尝试使用完整路径执行它。

答案 1 :(得分:2)

要像运行apache用户一样运行命令,只需在shell中尝试:

# switch to superuser
sudo su -
# then switch to the apache user
su - www-data

你会发现自己处于一个非常有限的shell中,通常无法启动openoffice。实际上,它需要很多环境,无论如何完全设置apache都是不安全的。

AFAIK,更好地创建一个允许运行命令的专用用户(例如常规的“www-runner”用户),然后从PHP“su”到它。其他安全措施包括chroot对dedidacted用户,或使用apparmor限制允许运行的内容和位置。无论如何,永远不要让www-data通过向sudoers添加www-data来以root身份运行:这太危险了!

你也可以看看libapache2-mod-suphp(suid apache模块运行带有所有者权限的php脚本)。它比专用的suEXEC apache beast更容易使用(http://httpd.apache。组织/文档/ 2.0 / suexec.html)。后者真的不是为了快速修复;)

答案 2 :(得分:1)

apache中的php可能会以安全模式运行,或者它调用的是什么,system()函数等都被禁用。

实际上,这个答案假设您所谓的“以apache用户身份运行”实际上是在apache环境中运行,无论它是什么。