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