好的,所以pecl ssh 2应该是libssh 2的 Package 器。libssh 2具有libssh2_channel_get_exit_status。有没有办法得到这些信息?我需要:-STDOUT-STDERR
nhn9ugyo1#
所以,第一件事是第一:不,他们没有实现libssh2_channel_get_exit_status。为什么?除了我。下面是ID所做的:
$command .= ';echo -e "\n$?"'
我填充了一个换行符和$的回声?在我执行的每个命令的末尾。兰吉?是的。不过,看起来效果不错。然后将其放入$returnValue中,并从stdout末尾去掉所有的换行符。也许有一天,获得渠道的退出状态将得到支持,几年后,它将在发行版仓库。就目前而言,这已经足够好了。当您运行30多个远程命令来填充复杂的远程资源时,这比为每个命令设置和拆除ssh会话要好得多。
deyfvvtc2#
我试图改进Rapzid的回答多一点。出于我的目的,我将ssh2 Package 在一个php对象中,并实现了这两个函数。它允许我使用正常的异常捕获来处理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 ); }
goucqfw63#
从SSH2 PHP扩展的0.13版本开始,您可以使用stream_get_meta_data()来检索退出状态。用你的例子的代码:
stream_get_meta_data()
// $connection is a SSH2 connection created with ssh2_connect() // $command is the command you want to execute $stream = ssh2_exec($connection, $command); $metadata = stream_get_meta_data($stream); $exitCode = $metadata['exit_status'];
3条答案
按热度按时间nhn9ugyo1#
所以,第一件事是第一:
不,他们没有实现libssh2_channel_get_exit_status。为什么?除了我。
下面是ID所做的:
我填充了一个换行符和$的回声?在我执行的每个命令的末尾。兰吉?是的。不过,看起来效果不错。然后将其放入$returnValue中,并从stdout末尾去掉所有的换行符。也许有一天,获得渠道的退出状态将得到支持,几年后,它将在发行版仓库。就目前而言,这已经足够好了。当您运行30多个远程命令来填充复杂的远程资源时,这比为每个命令设置和拆除ssh会话要好得多。
deyfvvtc2#
我试图改进Rapzid的回答多一点。出于我的目的,我将ssh2 Package 在一个php对象中,并实现了这两个函数。它允许我使用正常的异常捕获来处理ssh错误。
goucqfw63#
从SSH2 PHP扩展的0.13版本开始,您可以使用
stream_get_meta_data()
来检索退出状态。用你的例子的代码: