bash shell - Ausgabe und Exit-Code von ssh remote script capture?


23

Ich möchte Shell verwenden, um ein Skript auf einem Remote-Server aufzurufen. Ich möchte die Ausgabe dieses Skripts (seine Protokollmeldungen) und den zurückgegebenen Exit-Code erfassen.

Wenn ich das mache:

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

Ich erhalte den Exit-Code, kann aber die Remote-Logging-Meldungen nicht erfassen.

Wenn ich das mache:

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

Ich kann meine Ausgabe mit meiner LOG-Funktion protokollieren, kann aber anscheinend keinen korrekten Exit-Code erhalten. Ich gehe davon aus, dass der erhaltene Code der Code aus der varianble-Zuweisung ist.

Ich möchte meine LOG-Funktion weiterhin verwenden, um alle Ausgaben beim Formatieren zu erfassen und an eine Datei, Syslog und den Bildschirm zu senden.

Wie kann ich Ergebnisse in einer Variablen erfassen UND den richtigen Beendigungscode aus dem Remote-Skript abrufen?


Antworten:


37

Der Grund, warum Sie nicht den richtigen Fehlercode erhalten, ist, dass localtatsächlich das Letzte ausgeführt wurde. Sie müssen die Variable als lokal deklarieren, bevor Sie den Befehl ausführen.

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

Sie können das Problem hier sehen:

$ 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

Das "Lokale" scheint das Problem zu sein. Das funktioniert bei mir:

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

du hattest auch recht, aber jodanm war schneller!
mconlin

Ja, 26 Sekunden.
Hauke ​​Laging

5
Kein Englischunterricht, aber es ist falsch, "schneller" zu sagen.
Mtahmed

5
Ich weiß, dass es ein Witz war. Eine schlechte, nehme ich an. Im Internet weiß niemand, dass Sie ein Hund sind.
mconlin

auch jordanms antwort erklärt, warum dies das problem war :)
doktor j

2

Tatsächlich fängt keine der obigen Antworten den ssh-Fehlercode und die Meldung auf. Dies könnte folgendermaßen geschehen (ignoriere meine benutzerdefinierten Funktionen):

# 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.