Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php don';t通过shell执行命令后返回输出_Php_Linux_Shell_Fedora - Fatal编程技术网

Php don';t通过shell执行命令后返回输出

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不在您的路径上(或不在您的系统上)

在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
不在您的路径上(或不在您的系统上)
哪个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();