我希望有人能启发我并解释以下行为。
在 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 匹配在两个测试中都失败了,但是当我在第二种情况下反转匹配时,它现在返回每一行而不是不返回任何内容。
我仍然不知道为什么会这样。