【问题标题】:PHP exec() not working properlyPHP exec()无法正常工作
【发布时间】:2012-06-21 22:21:31
【问题描述】:

我在使用 PHP exec() 函数时遇到了困难。它似乎没有调用某些函数。例如,代码echo exec('ls'); 不会产生任何输出(应该是,目录中有文件)。这对我来说是个问题的主要原因是我正在尝试从 PHP exec() 调用中执行 .jar。

据我所知,我正确调用了 java 程序,但没有得到任何输出。 .jar 可以从服务器上的命令行执行。 (为了记录,它是一个 apache 服务器)。

我的 .jar 执行文件如下所示:

$output = array();
exec('java -jar testJava.jar', $output);
print_r($output);

我从这个 exec() 调用中得到的输出只有 Array()。

我已成功执行 exec() 执行 'whoami' 和 'pwd'。我无法弄清楚为什么有些功能可以工作而有些不能。我也不是 PHP 方面最有经验的人,所以我不太确定如何诊断这个问题。任何和所有的帮助将不胜感激。

【问题讨论】:

  • 确切的错误是什么?而且,你可能想使用这样的东西:new BufferedWriter(new FileWriter(new File("out.txt")));
  • 该错误实际上是 out.txt 的 FileNotFoundException 。我的理解是该文件没有被创建,因此没有找到它。
  • 您可能还需要更改 jar 尝试将文件写入到的目录的权限。不仅仅是 jar 文件本身的权限。
  • 是的,好像是这样。您也可以尝试用 File 包裹它。
  • @AlexLynch 嘿,这行得通 - 现在 .jar 从命令行执行没问题。我现在用 PHP 试试并更新我的问题。

标签: php apache unix exec


【解决方案1】:

你不能执行 ls 是因为权限问题。

如果您以 user A 身份运行 Web 服务器,那么您只能 ls 仅对具有 user A 权限的目录进行操作。

您可以更改目录的权限,也可以通过更改 httpd.conf 文件来更改运行服务器的用户(我假设您使用的是 apache)。

如果您要更改目录的权限,请确保您也更改了父目录的权限。

要更改网络服务器用户,请执行以下步骤:

打开以下文件:

vi /etc/httpd/conf/httpd.conf

搜索

User apache
Group apache

更改用户名和组名。更改用户和组后,使用以下命令重新启动服务器。

/sbin/service httpd restart

然后您将能够执行该用户可以运行的所有命令。

编辑:

“用户”应该是 httpd.conf 中的非 root 用户。默认情况下,Apache 在以 root 身份运行时不提供页面。您必须将用户设置为非 root 用户,否则会出错。 如果要强制 apache 以 root 身份运行,则必须设置如下环境变量:

env CFLAGS=-DBIG_SECURITY_HOLE

然后你必须重新构建 apache 才能以 root 身份运行它。

【讨论】:

  • 这不太奏效 - 我按照您的步骤操作,但出现错误,要求我将 -DBIG_SECURITY_HOLE CFLAG 添加到 env 变量中。我对 CFLAG 不太熟悉,因为它们与 Apache 相关。
  • @MattS 我已经编辑了我的答案来解释你为什么会收到这个错误。我的建议是您以非 root 用户身份运行 apache,而不是重新构建 apache。
  • 我把用户/组改成了管理员用户(就在root下面),还是不行。
【解决方案2】:

我发现了问题 - SELinux 阻止 PHP 访问某些函数。将 SELinux 置于许可模式已经解决了这些问题(不过,我宁愿不必让 SELinux 处于许可模式;如果可以的话,我宁愿找到一种允许某些功能的方法)。

【讨论】:

  • 尝试使用audit2allow -a 命令分析日志并显示需要使用的权限。
【解决方案3】:

我有一个解决方案: 命令从控制台运行,但不是通过 exec/system/passthru 从 php 运行。 问题是命令的路径。它适用于命令的绝对路径

这样:

wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"

变成:

/usr/local/bin/wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"

现在,它可以通过 exec 从 php 运行 您可以通过whereis wkhtmltopdf查看命令二进制文件的位置

【讨论】:

    【解决方案4】:

    想弄清楚为什么 PHP exec 在命令行中工作而不是在 Apache 中工作,我费尽心思。最后,我找到了以下权限:

    ***getsebool -a | grep httpd*** ----> 
        **httpd_setrlimit --> off
        httpd_ssi_exec --> off
        httpd_sys_script_anon_write --> off**
    

    使用:setsebool -P httpd_ssi_exec 1

    查看:https://linux.die.net/man/8/httpd_selinux

    【讨论】:

      【解决方案5】:

      您的问题不是执行问题,而是 exec 命令的语法。第二个参数始终作为数组返回,并在每个索引中包含一行输出。 exec 函数的返回值将包含命令输出的最后一行。要显示输出,您可以使用:

      foreach($output as $line) echo "$line\n";

      详情请参阅http://php.net/manual/en/function.exec.php。您还可以使用第三个参数获取命令的退出值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        相关资源
        最近更新 更多