shell bash - sortie de capture de script distant ssh et code de sortie?

23

Je souhaite utiliser shell pour invoquer un script sur un serveur distant. Je voudrais capturer la sortie de ce script (ses messages de journalisation) et le code de sortie qu'il renvoie.

Si je fais ça:

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

J'obtiens le code de sortie mais je ne peux pas capturer les messages de journalisation à distance.

Si je fais ça:

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

J'arrive à enregistrer ma sortie à l'aide de ma fonction LOG mais je n'arrive pas à obtenir un code de sortie correct, je suppose que le code que j'obtiens est le code de l'affectation des variables.

Je voudrais continuer à utiliser ma fonction LOG pour capturer toutes les sorties au fur et à mesure qu'elles formatent et envoient des choses à un fichier, syslog et l'écran pour moi.

Comment puis-je capturer les résultats dans un var ET obtenir le code de sortie correct du script distant?

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

Réponses:

37

La raison pour laquelle vous n'obtenez pas le bon code d'erreur est qu'il locals'agit en fait de la dernière chose exécutée. Vous devez déclarer la variable comme locale avant d'exécuter la commande.

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

Vous pouvez voir le problème ici:

$ 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
la source
8

Le «local» semble être le problème. Cela fonctionne pour moi:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
Hauke ​​Laging
la source
vous aviez raison aussi, mais jodanm était plus rapide!
mconlin
Oui, 26 secondes.
Hauke ​​Laging du
5
Pas un cours d'anglais mais il est incorrect de dire «plus vite».
mtahmed
5
Je sais que c'était une blague. Un mauvais je suppose. Sur Internet, personne ne sait que vous êtes un chien.
mconlin
aussi la réponse de jordanm explique POURQUOI c'était le problème :)
Doktor J
3

En fait, aucune des réponses ci-dessus ne piège le code d'erreur et le message ssh, ce qui pourrait être fait comme suit (ignorer mes fonctions personnalisées):

# 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
la source