O comando executado via ssh não retorna o código de retorno correto

5

Por que isso não funciona?

$ ssh vm "bullshitcommand; echo $?"
bash: bullshitcommand: command not found
0

Eu esperava um código de retorno diferente de zero.

    
por Enuy 01.10.2013 / 10:54

3 respostas

6

Motivo:

echo $? , você está, na verdade, enviando uma variável local $? e pedindo para exibir em ssh shell, ao que parece. Você pode provar isso usando um comando não existente antes da instrução ssh. Por exemplo:

notexistingcommand; ssh vm "echo $?" de saídas

bash: nonexistentcommand: command not found

127

ou até mesmo

export var=123; ssh vm "echo $var" de saídas

123

Solução:

O que você pode fazer para usar a variável remota está escapando e que vai cuspir -1 (ou 127):

ssh vm "nonexistentcmd; echo \$?"

Ou você pode usar aspas simples ( '), pois elas não expandem as variáveis e recebem $ literalmente

ssh vm 'nonexistentcmd; echo $?'

    
por 01.10.2013 / 11:55
3

Em vez de dizer:

ssh vm "bullshitcommand; echo $?"

diga:

ssh vm "bullshitcommand"
echo $?

O código de retorno de ssh seria o mesmo que o do comando remoto.

    
por 01.10.2013 / 12:10
1

Você disse que isso não funciona:

$ ssh vm "bullshitcommand; echo $?"
bash: bullshitcommand: command not found
0

Primeiro, vamos analisar os personagens:

"not important $? not important"

é interpretado localmente no lado do cliente, não no servidor. Isso será interpretado como:

"not important 0 not important"

porque variável especial do lado do cliente (local) $? geralmente é 0. Para evitar isso você deve fazer o escape, porque você quer colocar o texto $? como é sem substituição:

"not important \$? not important"

Outro problema é o que você faz. Você simplesmente perdeu o código de saída de seu interesse. Vamos ver o exemplo abaixo:

$ ssh vm "bullshitcommand; echo external ret: \$?"; echo internal ret: $?
bash: bullshitcommand: command not found
external ret: 127
internal ret: 0

o que aconteceu? $ externo? intercepta o código de saída, em seguida, um passo depois disso você tem exitcode do comando echo. Isso é sempre 0 porque echo não tem possibilidade de travar :) E finalmente o servidor ssh obtém o código de saída do último comando, ele é obtido a partir do eco e é 0. Depois disso, o código 0 é dado pelo cliente ssh. Finalmente, este comando causa ssh sai com 0.

Você pode solucionar isso salvando $ temporariamente? valor, por exemplo, assim:

$ ssh vm "bullshitcommand; exitcode=\$? echo external ret: \$exitcode; exit \$exitcode"; echo internal ret: $?
bash: bullshitcommand: command not found
external ret: 127
internal ret: 127

Quando você receberá esse resultado, você está em casa :). O problema é, exitstatus é imperativo, e acima você tem solução para isso. Lembre-se de escapar:)

Mas preste atenção para servidores e clientes ssh quebrados históricos. Às vezes, o servidor e / ou o cliente ignora o status de saída e retorna permanentemente o código de retorno 0. Teste-o se precisar ter certeza. Se você tiver essa situação, deverá atualizar o software ou fazer alguma solução alternativa com a transferência do código de saída pelo fluxo de stdout. É um trabalho adicional para script e programador que faz isso.

    
por 27.02.2014 / 11:53

Tags