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.