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

#!/bin/bash

ssh root@10.0.0.60 "$1"

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

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

2 ответа2

2
if [[ $? ]]; then

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

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

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

Или, если вы явно хотите сослаться на $?:

if [[ $? = 0 ]]; then
    echo pass
else
    echo fail
fi
1

Из прекрасного руководства по 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
$ 

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