Php don';t通过shell执行命令后返回输出
在Fedora 20中执行php脚本后: 将显示空字符串 如果要在命令行中执行“which systemctl”,将显示以下内容:Php don';t通过shell执行命令后返回输出,php,linux,shell,fedora,Php,Linux,Shell,Fedora,在Fedora 20中执行php脚本后: 将显示空字符串 如果要在命令行中执行“which systemctl”,将显示以下内容: /usr/bin/which: no systemctl in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin) 如何通过php接收此输出?因为systemctl不在您的路径上(或不在您的系统上)
/usr/bin/which: no systemctl in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
如何通过php接收此输出?因为
systemctl
不在您的路径上(或不在您的系统上)哪个systemctl
返回错误消息
/usr/bin/which: no systemctl in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
当您在PHP中使用shell_exec('which systemctl')运行它时代码>未收集标准错误,标准输出为空。因此PHP会看到一个空字符串
您可以使用以下命令获取标准错误:
shell_exec('which systemctl 2>&1');
我在我的项目中使用passthru,代码如下:
$output = '';
ob_start();
passthru('which systemctl', $output);
$output = ob_get_contents();
ob_end_clean();
shell_exec也会返回一个输出,请参见此处的文档:
但是一个passthru和shell_exec都在工作。使用带有可选输出参数的exec()
,这在完全意义上是不正确的。示例:我只有echo shell_exec('which systemctl')
在我的PHP文件中,但是我正确地得到了关于缺少二进制文件的消息(因此没有STDERR到STDOUT重定向,但是shell_exec()
仍然收集输出)@AlmaDo:shell_exec()
的返回值是已执行命令的STDOUT,STDERR转到PHP的STDERR。尝试运行$result=shell_exec('which blah')
-您仍然会看到错误消息,并且$result
将为空。如果将命令的stderr重定向到其stdout上(这就是2>&1
正在做的),则$result
将同时包含已执行命令的stdout和stderr。
$output = '';
ob_start();
passthru('which systemctl', $output);
$output = ob_get_contents();
ob_end_clean();