web-dev-qa-db-fra.com

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

Je souhaite utiliser Shell pour appeler 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 bon code de sortie du script distant?

26
mconlin

La raison pour laquelle vous n'obtenez pas le code d'erreur correct est que local est en fait 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
40
jordanm

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

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

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
3
Yordan Georgiev