我有一个 PHP 应用程序,它通过 SSH 登录到本地机器,启动一个 shellscript 并将该脚本的输出实时打印回浏览器(通过保持页面加载)。
但是,当 shellscript 达到sudo service apache2 reload > /dev/null
1024 字节时,看似随机的内存会被转储并在脚本正常完成时中止输出。
当连接最终终止时(例如通过终止它),屏幕上会出现一些额外的随机内容,具体取决于连接保持打开的时间。
正在执行的 PHP 脚本只会读取 SSH 连接的标准输出,直到发生一些中止/终止事件。除此之外,它将 ANSI 颜色代码转换为 HTML <span>
:
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 排除在外。
相关东西的安装版本:
- PHP
5.3.3-7+squeeze17 with Suhosin-Patch (cli) (built: Aug 23 2013 15:06:16)
我需要 PHP 5.3,因为旧版应用程序无法处理新版本。 - libssh2-php
0.11.0-2.1
- OpenSSL
1.0.1e-2+deb7u7
( https://www.debian.org/security/2014/dsa-2896 ) - openssh 服务器
1:6.0p1-4+deb7u1
如何解决此问题以不再转储随机内存?