PHP Exec函数报告某些通过SSH工作的命令失败


1

我在使用PHP 5.4.12的CentOS 6 64位上。

这是PHP非常奇怪的行为。

请参阅以下脚本:

echo 'Trying Query: whereis jbig2dec<br>';
exec('whereis jbig2dec',$output) or die('Failed');

$location=explode(' ',implode($output));
$location=$location[1];

echo 'Result: '.implode($output)."<p>";

echo 'Trying Query: '.$location.' --help<br>';
exec($location.' --help',$output) or die('Failed');

echo 'Result: '.implode($output)."<p>";

echo 'Trying Query: jbig2dec --help<br>';
exec('jbig2dec --help',$output) or die('Failed');

echo 'Result: '.implode($output)."<p>";

结果是:

Trying Query: whereis jbig2dec
Result: jbig2dec: /usr/local/bin/jbig2dec
Trying Query: /usr/local/bin/jbig2dec --help
Failed

基本上你可以看到上面的PHP exec函数适用whereis jbig2dec但失败了/usr/local/bin/jbig2dec --help。但是如果我键入/usr/local/bin/jbig2dec --helpjbig2dec --help进入SSH,我会从jbig2dec得到正确的响应。

怎么会这样?

Answers:


4

检查/usr/local/bin/jbig2dec --helpover SSH 的返回值,如下所示:

$ /usr/local/bin/jbig2dec --help
[... generates some output ...]
$ echo $?

最后一个命令打印上一个调用的“返回值”。返回值0是“命令执行成功”的“shell方式”。其他东西的返回值表示错误。

如果exec()遇到非0的返回值(某些程序在帮助消息上给出,因为程序在技术上没有运行),它将在PHP上下文中返回“false”,从而触发该or die()部分并终止给定的PHP脚本错误信息。

简而言之:您的命令可能不会返回成功状态,并且您告诉PHP die()它是否不成功。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.