7

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

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

我的 .jar 执行的 php 如下所示:

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

我从这个 exec() 调用中得到的输出是Array().

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

4

5 回答 5

4

您无法执行 ls 的原因是因为权限。

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

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

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

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

打开以下文件:

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 身份运行它。

于 2012-06-23T22:00:40.380 回答
3

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

以便:

wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"

变成:

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

现在,它可以通过 exec 从 php 运行 Where 命令二进制文件,您可以通过whereis wkhtmltopdf

于 2014-07-04T08:24:08.027 回答
3

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

于 2012-06-26T19:56:39.747 回答
2

试图弄清楚为什么 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

于 2018-09-30T02:26:34.480 回答
-1

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

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

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

于 2013-05-23T08:52:12.683 回答