У меня есть команда вида:
dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz"
Как проверить, не сработала ли команда ssh из-за проблем с подключением?
Благодарю.
У меня есть команда вида:
dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz"
Как проверить, не сработала ли команда ssh из-за проблем с подключением?
Благодарю.
От 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
если сбой "из-за проблем с подключением".
Использование: echo ${PIPESTATUS[1]}
Или echo ${PIPESTATUS[*]}
чтобы проверить состояние завершения всех команд.
см. примеры: $ PIPESTATUS:
Члены массива
$PIPESTATUS
хранят состояние завершения каждой соответствующей команды, выполняемой в канале.$PIPESTATUS[0]
содержит состояние выхода первой команды в канале,$PIPESTATUS[1]
состояние выхода второй команды и т.д.