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?


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

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 $?

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.