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?


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

8

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.