Хорошо, поэтому pecl ssh2 предположительно является оберткой для libssh2. У libssh2 есть libssh2_channel_get_exit_status. Есть ли способ получить эту информацию?
МНЕ НУЖНО:
-stdout
-STDERR
-EXIT STATUS
Я получаю только статус выхода. Многие люди бросают вокруг phplibsec, когда ssh воспитывается, но я не вижу способа получить stderr или статус выхода канала из этого: / Кто-нибудь смог получить все три?
Итак, во-первых, первое:
НЕТ, они не реализовали libssh2_channel_get_exit_status. Зачем? За мной.
Вот что сделал идентификатор:
$command .= ';echo -e "\n$?"'
Я впишу новую строку и эхо $? на конец каждой команды I exec. Стройный? Да. Но, похоже, это получилось довольно хорошо. Затем я вытащил это в $ returnValue и разделил все новые строки с конца stdout. Может быть, когда-нибудь получится статус выхода канала, и через несколько лет он будет в дистрибутиве. На данный момент это было достаточно хорошо. Когда вы запускаете более 30 удаленных команд для заполнения сложных удаленных ресурсов, это намного лучше, чем настройка и отключение сеанса ssh для каждой команды.
Я попытался улучшить ответ Рапзида немного больше. Для моих целей я завернул ssh2 в 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 ); }