我在使用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最有经验的人,所以我不太清楚如何诊断这个问题。任何和所有的帮助将不胜感激。
答案 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
答案 4 :(得分:-1)
您的问题不是执行问题,而是exec命令的语法。第二个参数始终作为数组返回,并在每个索引中包含一行输出。 exec函数的返回值将包含命令输出的最后一行。要显示您可以使用的输出:
foreach($ output as $ line)echo“$ line \ n”;
有关详细信息,请参阅http://php.net/manual/en/function.exec.php。您还可以使用第三个参数获取命令的退出值。