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

20

Eu desejo usar o shell para invocar um script em um servidor remoto. Eu gostaria de capturar a saída desse script (suas mensagens de registro) e o código de saída retornado.

Se eu fizer isso:

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

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

Se eu fizer isso:

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

Eu consigo logar minha saída usando minha função LOG mas não consigo obter um código de saída correto, suponho que o código que obtenho seja o código da atribuição varianble.

Eu gostaria de continuar a usar minha função LOG para capturar todas as saídas enquanto elas são formatadas e envia coisas para um arquivo, syslog e a tela para mim.

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

    
por mconlin 01.03.2013 / 18:12

3 respostas

31

O motivo pelo qual você não está obtendo o código de erro correto é porque local é realmente 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
    
por 01.03.2013 / 18:25
7

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

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
    
por 01.03.2013 / 18:25
0

Na verdade, nenhuma das respostas acima captura o código de erro e a mensagem do 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
    
por 24.07.2017 / 11:19