SSH経由でローカルマシンにログインし、シェルスクリプトを開始し、そのスクリプトからの出力をリアルタイムでブラウザーに出力するPHPアプリケーションがあります(ページの読み込みを維持することにより)。
ただし、シェルスクリプトがsudo service apache2 reload > /dev/null
1024 バイトに達すると、一見ランダムなメモリがダンプされ、スクリプトが正常に終了するまで出力が中断されます。
接続が最終的に終了すると (たとえば、接続を強制終了することによって)、接続が開いたままになっている時間に応じて、追加の量のランダムなものが画面全体に吐き出されます。
実行中の PHP スクリプトは、何らかの中止/終了イベントが発生するまで、SSH 接続の stdout を読み取るだけです。それ以外は、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
この問題を修正して、ランダムメモリをダンプしないようにするにはどうすればよいですか?