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?

mconlin
quelle

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
Jordanien
quelle
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 $?
Hauke ​​Laging
quelle
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
Jordan Georgiev
quelle