I tried to improve upon Rapzid's answer a bit more. For my purposed I wrapped ssh2 in a php object and implemented these two functions. It allows me to handle the ssh errors using sane exception catching.
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
, the echo wont be run.$command = '(' . $command . ');echo -e "\n$?"'
might be better. – Solvent