0

我希望有人能启发我并解释以下行为。

在 php 中使用 shell_exec 时,以下代码在 shell 中直接由 php 运行时和通过网页上的 Apache 运行时会给出不同的结果。这并不是说我期望值(cpu、进程计数、ram 等)完全相同,因为这是完全不可能的。问题是某些线条(顶部的summery)完全丢失了。

该示例很简单,因此应该可以在 apache/phe 服务器上重现,

php代码如下:

<?php
  $command = 'top -b -n1';
  $commandoutput = shell_exec($command);
  echo strlen($commandoutput);

  echo ":";

  $command = 'top -b -n1 | grep -e "^\s*[a-Z]"';
  $commandoutput = shell_exec($command);
  echo strlen($commandoutput);
?>

当直接在 shell 中作为 www-data (php test.php) 运行时,我得到以下结果:

8147:450

但是当我通过网页( http://MY.SERVER/test.php )运行完全相同的代码时,我得到了结果:

8147:0

如果我打印变量 $commandoutput 很容易看出缺少什么。不知何故,顶部的顶部被遗漏了。出于某种原因,以下行在通过 grep 管道后未包含在网页中。

top - 23:17:13 up 29 days,  9:20,  3 users,  load average: 0.67, 0.85, 0.72
Tasks:  93 total,   1 running,  92 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.4%sy,  0.0%ni, 89.5%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    507452k total,   453176k used,    54276k free,    41024k buffers
Swap:   407544k total,    40524k used,   367020k free,   287916k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

我认为这不是权限问题,因为不使用 grep 时结果是正确的。grep 有什么魔力干扰 shell_exec。我根本无法理解 shell_exec 如何根据我运行脚本的方式返回不同的结果。

任何人都可以解释发生了什么,或者至少可以引导我朝着正确的方向前进吗?

附加信息: 另一个例子:

在上面的示例中,通过 apache 运行代码使 grep 不正确匹配,导致行数少于预期。

如果我将正则表达式倒置并匹配我不想要的行

顶部 -b -n1 | grep -v -e "^\s*[0-9]"

这一次,在浏览网页时,我得到了太多的行。我可以在 to 案例之间看到的唯一链接如下。Grep 匹配在两个测试中都失败了,但是当我在第二种情况下反转匹配时,它现在返回每一行而不是不返回任何内容。

我仍然不知道为什么会这样。

4

0 回答 0