bash shell - o script remoto ssh captura o código de saída e saída?

23

Desejo usar o shell para chamar um script em um servidor remoto. Gostaria de capturar a saída desse script (suas mensagens de log) e o código de saída que ele retorna.

Se eu fizer isso:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

Eu recebo o código de saída, mas não consigo capturar as mensagens de log remoto.

Se eu fizer isso:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

Consigo registrar minha saída usando minha função LOG, mas não consigo obter um código de saída correto, presumo que o código que recebo seja o código da atribuição variável.

Gostaria de continuar usando minha função LOG para capturar toda a saída conforme formata e envia as coisas para um arquivo, syslog e a tela para mim.

Como capturar resultados em uma var E obter o código de saída correto do script remoto?

mconlin
fonte

Respostas:

37

O motivo pelo qual você não está obtendo o código de erro correto é porque, localna verdade, é a última coisa executada. Você precisa declarar a variável como local antes de executar o comando.

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

Você pode ver o problema aqui:

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
jordanm
fonte
8

O "local" parece ser o problema. Isso funciona para mim:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
Hauke ​​Laging
fonte
você estava certo também, mas jodanm era mais rápido!
mconlin
Sim, 26 segundos.
Hauke ​​Laging 01/03/2013
5
Não é uma aula de inglês, mas é incorreto dizer 'mais rápido'.
mtahmed
5
Eu sei que foi uma piada. Uma má, suponho. Na internet, ninguém sabe que você é um cachorro.
mconlin
também a resposta de jordanm explica porque este era o problema :)
Doktor J
2

Na verdade, nenhuma das respostas acima intercepta o código e a mensagem de erro ssh, o que pode ser feito da seguinte maneira (ignore minhas funções personalizadas):

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && doExit $exit_code $err_msg
Yordan Georgiev
fonte