我有一个PHP应用程序,通过SSH登录到本地计算机,启动一个shellcript并将该脚本的输出实时打印回浏览器(通过保持页面加载)。
然而,当shellcript命中sudo service apache2 reload > /dev/null
时,1024个字节的看似随机的内存被转储,输出在脚本正常完成时中止。
当连接最终终止时(例如通过杀死它),在屏幕上会出现一些额外的随机内容,具体取决于连接保持打开的时间。
正在执行的PHP脚本只读取SSH连接的标准输出,直到发生一些中止/终止事件。除此之外,它将ANSI颜色代码转换为HTML <span>
s:
stream_set_blocking($this->stdo, true);
fwrite($this->stdo, $cmd . "\n"); // write command to start running shellscript
$buf = '';
do
{
$buf = fread($this->stdo, 256);
if ($ansicolor)
echo $this->ansicolor($buf); // color codes are translated to HTML here
else
echo $buf;
flush();
ob_flush();
}
while (strpos($buf, '$') === false);
flush();
ob_flush();
对于所有与安全相关的人:PHP正在登录普通用户,该用户只能使用“NOPASSWD”sudo。
我可以告诉sudo
调用是导致问题的原因,因为我的脚本会频繁输出通过echo
显示正常情况的内容。
另外,我不想在重载失败并吐出实际有用的错误的情况下将stderr送走。
相关事物的已安装版本:
5.3.3-7+squeeze17 with Suhosin-Patch (cli) (built: Aug 23 2013 15:06:16)
0.11.0-2.1
1.0.1e-2+deb7u7
(https://www.debian.org/security/2014/dsa-2896)1:6.0p1-4+deb7u1
如何解决此问题不再转储随机内存?
答案 0 :(得分:0)
你没有看到&#34;内存转储&#34;屏幕上。您看到的是stderr上的service
命令的输出。它通常在屏幕上看起来像这样:
* Reloading web server config apache2 [OK]
[OK]消息正在进行一些ANSI格式化,这将填充1024字节的其余部分。
如果你想避免&#34;垃圾&#34;,同时仍然看到错误,你想要去掉所有的ANSI格式。像这样:
service apache2 reload >/dev/null 2> >(sed -r "s/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g")