it-swarm.com.de

bash Shell - ssh Remote Script Capture Ausgabe und Exit Code?

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

Wenn ich das mache:

ssh [email protected] /usr/local/scripts/test_ping.sh
echo "$?"

Ich erhalte den Exit-Code, kann jedoch die Remote-Protokollierungsnachrichten nicht erfassen.

Wenn ich das mache:

local RESULTS=$(ssh [email protected] /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 Code, den ich erhalte, der Code aus der varianble-Zuweisung ist.

Ich möchte meine LOG-Funktion weiterhin verwenden, um alle Ausgaben während des Formats zu erfassen und Dinge für mich an eine Datei, ein Syslog und den Bildschirm zu senden.

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

26
mconlin

Der Grund, warum Sie nicht den richtigen Fehlercode erhalten, ist, dass local tatsächlich das letzte ausgeführte ist. Sie müssen die Variable als lokal deklarieren, bevor Sie den Befehl ausführen.

local RESULTS
RESULTS=$(ssh [email protected] /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
40
jordanm

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

local RESULTS
RESULTS=$(ssh [email protected] /usr/local/scripts/test_ping.sh)
echo $?
8
Hauke Laging

Tatsächlich fängt keine der obigen Antworten den SSH-Fehlercode und die Meldung ein, was wie folgt geschehen kann (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
3
Yordan Georgiev