最初に ssh2_exec を介してコマンドを実行し (認証が成功した後)、変数で回答を読み取ります。以下の私のコード(認証なし)
try {
$stdout_stream = ssh2_exec($this->connection, $_cmd);
$stderr_stream = ssh2_fetch_stream($stdout_stream, \SSH2_STREAM_STDERR);
} catch (Exception $e) {
$std_output = $e->getMessage();
return false;
}
$output = "";
while (!feof($stdout_stream)) {
$output .= fgets($stdout_stream, 4096);
}
while (!feof($stderr_stream)) {
$output .= fgets($stderr_stream, 4096);
}
fclose($stdout_stream);
fclose($stderr_stream);
return $output;
たとえば、次のような cmd を実行しようとします。
sudo service httpd stop && sudo service httpd start
したがって、コマンドが正常に実行されると、すべてが良好で、応答は
httpd のシャットダウン: [ OK ] httpd の起動: [ OK ]
しかし、たとえば、sudoなしでそのようなコマンドを実行しようとすると
service httpd stop && service httpd start
サーバーが「コマンドが見つかりません」などのようなことを言っていることは知っていますが、このエラーを取得できません。このスクリプトは無限に実行されます。
この方法でコードを書き直そうとしました(またはこれに似た別の方法)
$dataString = fgets($stdout_stream);
if($dataString == "\n" || $dataString == "\r\n" || $dataString == "") {
//var_dump("Empty line found.");
}
if($dataString === false && !feof($stdout_stream)) {
//var_dump("not string");
} elseif($dataString === false && feof($stdout_stream)) {
//var_dump("We are at the end of the file.\n");
break;
} else {
//else all is good, process line read in
$output .= $dataString;
}
}
しかし、結果は同じです。
したがって、問題は、何が原因で無限ループ$stdout_stream
または$stderr_stream
.
PHP 5.3 を使用しています。