我希望有人可以启发我并解释以下行为。
在php中使用shell_exec时,以下代码在shell中直接通过php运行并通过网页上的Apache运行时会产生不同的结果。并不是我期望值(cpu,进程数,ram等)完全相同,因为这是不可能的。问题是一些线(顶部的总和)完全缺失。
示例很简单,因此应该可以在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不正确匹配,导致行数少于预期。
如果我将正则表达式颠倒并匹配我不想要的行
top -b -n1 | grep -v -e“^ \ s * [0-9]”
这一次,当浏览网页时,我得到太多行。我可以在案例之间看到的唯一链接如下。 Grep匹配在两个测试中都失败了,但是由于我在第二种情况下反转了匹配,它现在返回每一行而不是返回任何内容。
我仍然不知道为什么会这样。