bash shell - salida de captura de script remoto ssh y código de salida?


23

Deseo usar shell para invocar un script en un servidor remoto. Me gustaría capturar la salida de ese script (sus mensajes de registro) y el código de salida que devuelve.

Si hago esto:

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

Me sale el código de salida pero no puedo capturar los mensajes de registro remoto.

Si hago esto:

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

Puedo registrar mi salida usando mi función LOG pero parece que no puedo obtener un código de salida correcto, supongo que el código que obtengo es el código de la asignación de varianble.

Me gustaría continuar usando mi función LOG para capturar toda la salida a medida que se formatea y envía cosas a un archivo, syslog y la pantalla por mí.

¿Cómo puedo capturar resultados en una variable Y obtener el código de salida correcto del script remoto?


Respuestas:


37

La razón por la que no obtiene el código de error correcto es porque en localrealidad es lo último que se ejecutó. Debe declarar la variable como local antes de ejecutar el comando.

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

Puedes ver el problema aquí:

$ 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

El "local" parece ser el problema. Esto funciona para mi:

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

también tenías razón, ¡pero jodanm fue más rápido!
mconlin

Sí, 26 segundos
Hauke ​​Laging

55
No es una clase de inglés, pero es incorrecto decir "más rápido".
mtahmed

55
Sé que fue una broma. Una mala, supongo. En internet nadie sabe que eres un perro.
mconlin

también la respuesta de jordanm explica POR QUÉ este era el problema :)
Doktor J

3

En realidad, ninguna de las respuestas anteriores atrapa el código de error ssh y el mensaje, lo que podría hacerse de la siguiente manera (ignore mis funciones 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.