У меня есть команда вида:
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]состояние выхода второй команды и т.д.