Как проверить код выхода из туннеля ssh?

328
hebbo

У меня есть команда вида:

dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz" 

Как проверить, не прошла ли команда ssh из-за проблем с подключением?

Благодарю.

0

2 ответа на вопрос

1
Kamil Maciorowski

От man 1 bash:

Статус возврата конвейера - это статус выхода последней команды, если pipefailопция не включена. Если pipefailвключено, статус возврата конвейера - это значение последней (самой правой) команды для выхода с ненулевым статусом или ноль, если все команды завершаются успешно.

Тогда из man 1 ssh:

sshВыход с состоянием выхода удаленной команды или с, 255если произошла ошибка.

Обычно (с pipefailотключенным) вы получаете статус выхода ssh. Возможное значение 255может исходить от sshсамого себя или от любой команды, которую вы запускаете на удаленной стороне (но «общие» ошибки обычно приводят к «низкому» состоянию выхода, например 1, 2). На практике 255указывает, что что-то пошло не так.

Статус выхода доступен как специальный параметр $?сразу после выхода из канала. Пример:

$ true | ssh no-such-address.example.org true # error message here, skipped $ echo $? 255 

Чтобы получить более конкретную информацию ssh, вам нужно проанализировать ее stderr. Смотрите руководство, особенно -E(если доступно) и -vопции. -Eуказывает, в какой файл журнала sshследует писать, но вы получите аналогичный эффект, перенаправив stderr с помощью 2>/path/to/logfile. О себе -v:

-v
Детальный режим. Причины sshраспечатки отладочных сообщений о его ходе. Это полезно при отладке проблем с подключением, аутентификацией и настройкой. Несколько -vопций увеличивают многословие. Максимум есть 3.

Таким образом, общая процедура выглядит следующим образом: после sshвыхода проверьте состояние выхода; если это так 255, проанализируйте, произошел logfileли сбой «из-за проблем с подключением».

0
GAD3R

Используйте: echo $

Или echo $проверить состояние выхода всех команд.

см. примеры: $ PIPESTATUS :

Члены $PIPESTATUSмассива хранят состояние выхода каждой соответствующей команды, выполняемой в канале. $PIPESTATUS[0]содержит состояние выхода первой команды в канале, $PIPESTATUS[1]состояние выхода второй команды и т. д.

Похожие вопросы