1

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

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

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

Благодарю.

2 ответа2

1

От 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

Использование: echo ${PIPESTATUS[1]}

Или echo ${PIPESTATUS[*]} чтобы проверить состояние завершения всех команд.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .