私はRapzidの答えをもう少し改善しようとしました。私の目的のために、私はPHPオブジェクトにssh2をラップし、これらの2つの機能を実装しました。 sshの例外を捕まえてsshエラーを処理することができます。
function exec($command)
{
$result = $this->rawExec($command.';echo -en "\n$?"');
if(! preg_match("/^(.*)\n(0|-?[1-9][0-9]*)$/s", $result[0], $matches)) {
throw new RuntimeException("output didn't contain return status");
}
if($matches[2] !== "0") {
throw new RuntimeException($result[1], (int)$matches[2]);
}
return $matches[1];
}
function rawExec($command)
{
$stream = ssh2_exec($this->_ssh2, $command);
$error_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
stream_set_blocking($stream, TRUE);
stream_set_blocking($error_stream, TRUE);
$output = stream_get_contents($stream);
$error_output = stream_get_contents($error_stream);
fclose($stream);
fclose($error_stream);
return array($output, $error_output);
}
コマンドが「exit 1」の場合、エコーは実行されません。 '$ command = '('。$ command。 '); echo -e" \ n $? "''が良いかもしれません。 – Jesse