Por que fazer eco de $? variar de maneira diferente quando executado neste script? [duplicado]

1

Eu tenho o seguinte no meu script:

connectionTest=$(sshpass -p "${pass}" ssh -q -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "${remoteUser}"@"${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; echo $?")

Quando eu tiro o comando e o executo manualmente na máquina, recebo o código de saída que estou esperando. No entanto, sempre que o script é executado, o código de saída resultante é sempre 0.

Por que o código de saída sempre retornará como 0?

    
por Odinson 24.01.2018 / 23:33

1 resposta

3

O motivo pelo qual você está obtendo um status de retorno inesperado é a maneira como você citou seu comando para o host remoto.

Considere e contraste essas duas afirmações:

a=apple; ssh remotehost "a=banana; echo $a"
a=apple; ssh remotehost 'a=banana; echo $a'

No primeiro caso, o "... $a" é avaliado antes de o comando ssh ser executado, levando a essa situação efetiva:

ssh remotehost "a=banana; echo apple"

No segundo caso, o '... $a' é passado como um literal para o host remoto para execução, levando a essa situação efetiva:

ssh remotehost 'a=banana; echo $a'

Isso é exatamente o que está acontecendo com o seu $? . Como você o incluiu entre aspas duplas, ele é avaliado antes que o comando seja executado. Seu valor de zero é do seu comando anterior, então o que você está efetivamente executando é algo assim:

connectionTest=$(sshpass -p PASSWORD ssh ... "REMOTEUSER@REMOTEIP "echo quit | netcat ... ; echo 0")

O que você precisa é usar aspas simples para que o shell local o trate como um literal, assim:

connectionTest=$(sshpass -p "${pass}" ssh ... "${remoteUser}@${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; "'echo $?')

Observe que uma sequência de duas partes, como "hello"'world' , é concatenada como sendo um único valor helloworld . A primeira parte foi sujeita a avaliação de variáveis; a segunda parte não foi.

    
por 24.01.2018 / 23:59

Tags