PHP exec()无法正常工作

时间:2012-06-21 22:21:31

标签: php apache unix exec

我在使用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()

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

5 个答案:

答案 0 :(得分:4)

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

如果您将网络服务器作为用户A 运行,那么您只能 ls 仅限那些拥有用户A 权限的目录。

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

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

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

打开以下文件:

vi /etc/httpd/conf/httpd.conf

搜索

User apache
Group apache

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

/sbin/service httpd restart

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

编辑:

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

env CFLAGS=-DBIG_SECURITY_HOLE

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

答案 1 :(得分:3)

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

那样:

wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"

变为:

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

现在,它通过exec从php工作 您可以通过whereis wkhtmltopdf

查看命令二进制文件

答案 2 :(得分:2)

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

答案 3 :(得分:0)

试图弄清楚为什么PHP exec从命令行而不是Apache运行的原因使我大吃一惊。最后,我发现了以下权限:

$response = NewsAPI::topHeadlines()->get([
              'country' => 'us',
              'category'=>'technology'
          ]);
$articles = $response->articles;

使用情况: setsebool -P httpd_ssi_exec 1

请参阅:https://linux.die.net/man/8/httpd_selinux

答案 4 :(得分:-1)

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

foreach($ output as $ line)echo“$ line \ n”;

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