php - shell_exec,exec等..无法在终端中获得输出。即使是2>& 1

时间:2017-01-14 15:57:38

标签: php shell-exec

首先让我们通过终端运行命令:

$ echo 1; /etc/init.d/apache3 restart; echo 2;

结果..(apache3故意查看错误)

1
bash: /etc/init.d/apache3: No such file or directory
2

要命。

现在让我们通过php运行它。

<?php

$command = "echo 1; /etc/init.d/apache3 restart; echo 2; 2>&1";
$response = shell_exec("$command");
echo $response;

?>

我在浏览器上看到的只有:1 2

我尝试过各种各样的事情。用&#34;&amp;&amp;&#34;替换了半冒号。 尝试了所有的PHP东西,如..

passthru()
exec()
system()
popen()

我几乎尝试过这一切。几个小时..不能让它向我展示我通过终端看到的相同内容。

3 个答案:

答案 0 :(得分:1)

重启命令

后,您必须使用2&gt;&amp; 1

你的命令:

$command = "echo 1; /etc/init.d/apache3 restart; echo 2; 2>&1";

你的结尾有“2&gt;&amp; 1”,没用。

如果其他人使用STDERR

,您还会在每个命令后添加2&gt;&amp; 1
$command = "echo 1; /etc/init.d/apache3 restart 2>&1; echo 2 ";

答案 1 :(得分:1)

考虑使用exec。基函数仅返回输出的第一行

$response = exec("$command"); // just the first line

但是使用附加参数来捕获输出(作为数组)和返回值

$retval = NULL;
$output = NULL;
$response = shell_exec("$command", $output, $retval); // last two params are passed by reference and modified by the command

另外,当user993553发布时,这些cli函数在PHP中捕获的输出通常只返回stdout而不是stderr。你可以附加&#34; 2 - ;&安培; 1&#34;对于任何给定的命令(注意2之前的空格),以便将stderr路由到输出中。

那就是说,你的功能变成了:

$command = "echo 1; /etc/init.d/apache3 restart 2>&1; echo 2;";
$retval = NULL;
$output = NULL;
$response = exec($command, $output, $retval);
var_dump($output);

和输出:

array(3) {
  [0] =>
  string(1) "1"
  [1] =>
  string(37) "sh: 1: /etc/init.d/apache3: not found"
  [2] =>
  string(1) "2"
}

编辑:您还可以检查$ retval是否存在错误情况。如果它不为空或为零,则表示错误。

答案 2 :(得分:0)

来自shell_exec手册:

  

另请注意,shell_exec()不会抓取STDERR,因此请使用&#34; 2&gt;&amp; 1&#34;至   将它重定向到STDOUT并捕获它。