2

我有一个 PHP 应用程序,它通过 SSH 登录到本地机器,启动一个 shellscript 并将该脚本的输出实时打印回浏览器(通过保持页面加载)。

但是,当 shellscript 达到sudo service apache2 reload > /dev/null1024 字节时,看似随机的内存会被转储并在脚本正常完成时中止输出。
当连接最终终止时(例如通过终止它),屏幕上会出现一些额外的随机内容,具体取决于连接保持打开的时间。

正在执行的 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 排除在外。

相关东西的安装版本:

  • PHP5.3.3-7+squeeze17 with Suhosin-Patch (cli) (built: Aug 23 2013 15:06:16)
    我需要 PHP 5.3,因为旧版应用程序无法处理新版本。
  • libssh2-php0.11.0-2.1
  • OpenSSL 1.0.1e-2+deb7u7( https://www.debian.org/security/2014/dsa-2896 )
  • openssh 服务器1:6.0p1-4+deb7u1

如何解决此问题以不再转储随机内存?

4

1 回答 1

0

您没有在屏幕上看到“内存转储”。您看到的是servicestderr 上的命令的输出。它通常在屏幕上看起来像这样:

 * Reloading web server config apache2      [OK]

[OK] 消息具有一些 ANSI 格式,这会填充其余的 1024 个字节。

如果你想避免“垃圾”,同时仍然看到错误,你想去掉所有的 ANSI 格式。像这样的东西:

service apache2 reload >/dev/null 2> >(sed -r "s/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g")
于 2014-07-03T21:16:33.903 回答