Bash: Falha ao capturar o código de comando de saída executado remotamente via SSH

0

Estou usando o OpenSSH e tenho o seguinte script bash, chamado foo , no Debian 8 (Jessie) Linux:

#!/bin/bash

ssh [email protected] "$1"

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

Estou executando este script da seguinte forma:

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

Eu claramente não estou capturando com sucesso o código de saída do comando executado remotamente. Como posso fazer isso?

    
por Dave 19.07.2017 / 17:20

2 respostas

2
if [[ $? ]]; then

Isso testa se o valor de "$?" é uma string vazia ou não. Claro que não, então o teste sempre é avaliado como verdadeiro.

Você quer fazer um destes:

if ssh [email protected] "$1"; then
    echo pass
else
    echo fail
fi

Ou, se você quiser explicitamente referenciar $? :

if [[ $? = 0 ]]; then
    echo pass
else
    echo fail
fi
    
por 19.07.2017 / 17:38
1

De o bom manual para ssh(1) podemos encontrar

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

que parece contradizer sua reivindicação; com alguns testes, pode-se descobrir

$ ssh [email protected] true; echo $?
0
$ ssh [email protected] false; echo $?
1
$ 

(a menos que uma tenha uma função de shell que mascara o comando real ssh ; tente o caminho completo para ssh para evitar que, se for esse o caso) que aponta para a construção [[ $? ]] como sendo problemática; isso é fácil de testar e provar

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

Então, pode-se usar um teste de igualdade nos moldes de

$ true; [[ $? -eq 0 ]] && echo yea
yea
$ false; [[ $? -eq 0 ]] && echo yea
$ 
    
por 19.07.2017 / 17:36