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?

mconlin
fuente
solo salida: superuser.com/questions/130443/… | unix.stackexchange.com/questions/1630/redirect-stdout-over-ssh
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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
jordanm
fuente
8

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

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
Hauke ​​Laging
fuente
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
Yordan Georgiev
fuente