Код выхода удаленной команды SSH - PullRequest
0 голосов
/ 01 октября 2018

Я знаю, что есть много дискуссий по этому поводу, но мне нужна ваша помощь с кодами завершения удаленной команды ssh.У меня есть этот код: (scan это скрипт, который сканирует на наличие вирусов в указанном файле)

for i in $FILES 
do
    RET_CODE=$(ssh $SSH_OPT $HOST "scan $i; echo $?")
    if [ $? -eq 0 ]; then
        SOME_CODE

Сканирование работает и возвращает либо 0 или (1 для ошибок), либо 2, если вируснайденный.Но почему-то мой код возврата всегда равен 0. Даже если я сканирую вирус.

Вот вывод set -x:

++ ssh -i /home/USER/.ssh/id host 'scan Downloads/eicar.com; echo 0'
+ RET_CODE='File Downloads/eicar.com: VIRUS: Virus found.
    code of the Eicar-Test-Signature virus
0'

Вот вывод, если я выполню эти команды на"удаленный" компьютер без ssh:

[user@ws ~]$ scan eicar.com; echo $?
File eicar.com: VIRUS: Virus found.
    code of the Eicar-Test-Signature virus
2

Я просто хочу получить код возврата, мне не нужны все остальные выходные данные scan.

! ОБНОВЛЕНИЕ!

Кажется, echo это проблема.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

ssh возвращает состояние выхода всего конвейера, который он запускает - в этом случае это состояние выхода echo $?.

. То, что вы хотите сделать, это просто использовать результат sshнапрямую (поскольку вы говорите, что не хотите ничего выводить):

for i in $FILES 
do
    if ssh $SSH_OPT $HOST "scan $i >/dev/lull 2>&1"
    then
        SOME_CODE

Если вы действительно чувствуете, что должны напечатать код возврата, вы можете сделать это, не влияя на общий результат, используяEXIT trap:

for i in $FILES 
do
    if ssh $SSH_OPT $HOST "trap 'echo \$?' EXIT; scan $i >/dev/lull 2>&1"
    then
        SOME_CODE

Демонстрация:

$ ssh $host "trap 'echo \$?' EXIT; true"; echo $?
0
0
$ ssh $host "trap 'echo \$?' EXIT; false"; echo $?
1
1

Кстати, я рекомендую избегать имен переменных в верхнем регистре в ваших сценариях - они обычно используются для переменных среды, которые изменяют поведениепрограммы.

0 голосов
/ 01 октября 2018

Причина, по которой ваш ssh всегда возвращает 0, заключается в том, что последняя команда echo всегда выполняется успешно!Если вы хотите получить код возврата из scan, удалите echo или присвойте его переменной и используйте exit.В моей системе:

$ ssh host 'false'
$ echo $?
1
$ ssh host 'false; echo $?'
1
$ echo $?
0
$ ssh host 'false; ret=$?; echo $ret; exit $ret'
1
$ echo $?
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...