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

apt-get install не работает в WSL
IPTables - разрешить (принять) определенные IP-адреса в заблокированной подсети
Как остановить терминал bash от добавления частей предыдущих команд в текущую строку?
Командная строка Windows захват вывода сценария bash в один шаг
Простое использование tail & grep. Несколько условий
Debian 9: bash: ls, cat, команда не найдена после неправильного изменения пути
Использование sed для включения.файлы htaccess в конфигурации Apache
В Linux, как удалить папку с более чем 1 миллионом файлов?
Отправка имитированных нажатий клавиш в Bash
Использование wget для рекурсивного обхода сайта и загрузки изображений
Как получить доступ к папкам Windows из Bash на Ubuntu на Windows
Как запустить команду " cat " в фоновом режиме внутри скрипта
Скрипт Bash, который автоматически меняет раскладки клавиатуры и мыши на основе активного окна
Переменные не передаются из одного скрипта, вызывающего другой с bash heredoc
Как остановить tail-f, кроме использования kill

Bash: не удалось захватить код выхода команды, выполняемой удаленно через SSH

Я использую OpenSSH и у меня есть следующий сценарий bash с именем foo, на Debian 8 (Jessie) Linux:

#!/bin/bash

ssh root@10.0.0.60 ""

if [[ $? ]]; then
   echo "Pass"
else
   echo "Fail"
fi

Я выполняю этот скрипт следующим образом:

root@my_host:~/bin# foo 'echo "Hello world!"'
Hello world!
Pass
root@my_host:~/bin# foo true
Pass
root@my_host:~/bin# foo false
Pass
root@my_host:~/bin# foo not_a_command
bash: not_a_command: command not found
Pass

Я явно не могу успешно захватить код выхода удаленно выполняемой команды. Как я могу это сделать?

5
задан Dave
источник

2 ответов

if [[ $? ]]; then

это проверяет ли значение"$"?"пустая строка или нет. Конечно это не так, поэтому тест всегда возвращает значение true.

вы хотите сделать один из этих:

if ssh root@10.0.0.60 ""; then
    echo pass
else
    echo fail
fi

или, если вы явно хотите, чтобы ссылка $?:

if [[ $? = 0 ]]; then
    echo pass
else
    echo fail
fi
2
отвечен Kenster 2017-07-19 15:43:37
источник

С прекрасное руководство для ssh(1) мы можем наткнуться на

EXIT STATUS
     ssh exits with the exit status of the remote command or with 255 if an
     error occurred.

которое кажется, что противоречит вашей заявке; с некоторым испытанием одно может открыть

$ ssh root@10.0.0.60 true; echo $?
0
$ ssh root@10.0.0.60 false; echo $?
1
$ 

(если только у вас нет функции оболочки, которая маскирует реальный ssh команда; попробуйте полный путь к ssh чтобы избежать этого, если это так), который указывает на [[ $? ]] построить как проблематично; это легко проверить и доказать

$ true; [[ $? ]] && echo yea
yea
$ false; [[ $? ]] && echo yea
yea
$ 

таким образом, вместо одного можно использовать тест равенства по строкам

$ true; [[ $? -eq 0 ]] && echo yea
yea
$ false; [[ $? -eq 0 ]] && echo yea
$ 
1
отвечен thrig 2017-07-19 15:36:40
источник

Другие вопросы bash debian linux openssh ssh