2012-05-07 29 views
5

だから、pecl ssh2はおそらくlibssh2のラッパーです。 libssh2にはlibssh2_channel_get_exit_statusがあります。この情報を得る方法はありますか?PHPのssh2_execチャンネル終了ステータス?

私はNEED:
-stdout
-STDERR
-EXITのSTATUS

私はすべてが、終了ステータスを取得します。 sshが起動すると多くの人がphplibsecを投げつけますが、stderrやチャネルの終了状態を知る方法はありません。/誰も3つすべてを取得できましたか?

答えて

6

最初のものは最初です:
いいえ、彼らはlibssh2_channel_get_exit_statusを実装していませんでした。どうして?私を超えて。ここで

は、IDがやったことです:

$command .= ';echo -e "\n$?"' 

私は$の改行やエコーを塾?私はすべてのコマンドの終わりに私はエグゼクティブ。ランジ?はい。しかし、それはかなりうまくいったようです。私はそれを$ returnValueに引き出し、すべての改行をstdoutの終りから削除します。おそらくいつかチャンネルの終了ステータスを取得することができますし、それは数年後にはディストリビューションになります。今のところこれで十分です。実行中の30以上のリモートコマンドで複雑なリモートリソースを移植する場合、これは各コマンドのsshセッションを設定して終了するよりはるかに優れています。

+1

コマンドが「exit 1」の場合、エコーは実行されません。 '$ command = '('。$ command。 '); echo -e" \ n $? "''が良いかもしれません。 – Jesse

5

私は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); 
} 
関連する問題