【问题标题】:PHP command not executed system(), exec() or passthru()PHP 命令未执行 system()、exec() 或 passthru()
【发布时间】:2011-11-21 22:15:57
【问题描述】:

我正在尝试使用 open office 运行命令行文件转换。

openoffice pdf filename.doc 2>&1

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

我尝试了所有三个 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: (ALL) NOPASSWD: /path/to/openoffice

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

作为 apache 用户,我缺少什么让 PHP 不执行此命令?

【问题讨论】:

  • 你以Apache用户的身份在命令行上试过了吗?
  • 您尝试运行的命令是什么?您也可以使用“2> error.txt” 回显错误输出
  • 你尝试过除“openoffice”之外的其他命令吗?我建议 su-ing 到 apache 并尝试运行该命令,以排除任何问题。
  • 乔纳森,你能提供一个 su-ing for apache 的样本吗?谁能解释一下这个命令: // $wv_command_output = passthru("touch /root/temp.tmp | sudo /usr/bin/php -f /util/wvPDF.php");

标签: php system exec passthru sudoers


【解决方案1】:

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

【讨论】:

  • 我确实给了 openoffice 的拉路径。我正在某个地方将命令更改为:sudo /path/to/openoffice/openoffice pdf filename.doc 2>&1 我得到以下命令行输出:sudo:抱歉,您必须有一个 tty 才能运行 sudo
【解决方案2】:

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

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

您会发现自己处于一个非常受限的 shell 中,通常无法从该 shell 启动 openoffice。确实,它需要很多环境,无论如何完全设置apache是​​不安全的。

AFAIK,最好创建一个允许运行您的命令的专用用户(例如,普通的“www-runner”用户),然后从 PHP 中“su”到它。其他安全措施包括对指定用户进行 chroot,或使用 apparmor 来限制允许运行的内容和位置。在任何情况下,永远不要通过将 www-data 添加到 sudoers 来让 www-data 以 root 身份运行:这太危险了!

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

【讨论】:

    【解决方案3】:

    有可能你的 php 在 apache 中运行在安全模式或它叫什么,其中 system() 功能和类似的被禁用。

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

    【讨论】:

    • Michael,你能澄清一下以 apache 用户和 apache 环境运行的区别吗?顺便说一句,系统命令与另一个ghostscript命令一起使用,例如“gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffg3 -sOutputFile=${input_file_tif} -f $input_file”。你能解释一下为什么 print_r($command_output) 只返回 1 吗?
    • 如果它适用于另一个命令,那么情况并非如此(以 apache 用户身份运行 cli php 与从 apache php 模块或 fastcgi 或 cgi 运行脚本不同 - 它们都可能使用不同的配置文件)。
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2019-11-17
    • 2012-08-18
    • 2017-05-06
    相关资源
    最近更新 更多