Bash: Fehler beim Erfassen des Exit-Befehlscodes, der remote über SSH ausgeführt wird


0

Ich benutze OpenSSH und habe das folgende Bash-Skript mit dem Namen foo unter Debian 8 (Jessie) Linux:

#!/bin/bash

ssh root@10.0.0.60 "$1"

if [[ $? ]]; then
   echo "Pass"
else
   echo "Fail"
fi

Ich führe dieses Skript wie folgt aus:

root@my_host:~/bin# foo 'echo "Hello world!"'
Hello world!
Pass
root@my_host:~/bin# foo true
Pass
root@my_host:~/bin# foo false
Pass
root@my_host:~/bin# foo not_a_command
bash: not_a_command: command not found
Pass

Ich kann den Exit-Code des remote ausgeführten Befehls eindeutig nicht erfolgreich erfassen. Wie kann ich das machen?


Der Exit-Code, den Sie erhalten, stammt aus dem sshBefehl selbst.
Lungj

Die Methode echo-a-val funktioniert möglicherweise auch für Sie: stackoverflow.com/questions/13976289/… Dies funktioniert möglicherweise nicht für Sie, wenn Sie die Live-Ausgabe der Sitzung sehen müssen und es sich nicht leisten können, zusätzliche Daten an das auszugeben Konsole, aber es gibt eine andere Antwort exit, die für Ihre Situation funktionieren könnte.
Lungj

Ihr Problem ist mit dem Test. Versuchen Sie es if [[ $? -eq 0 ]]; then.
Simlev

Antworten:


2
if [[ $? ]]; then

Hiermit wird geprüft, ob der Wert von "$?" ist eine leere Zeichenfolge oder nicht. Natürlich nicht, daher wird der Test immer als wahr bewertet.

Sie möchten eine der folgenden Aktionen ausführen:

if ssh root@10.0.0.60 "$1"; then
    echo pass
else
    echo fail
fi

Oder wenn Sie ausdrücklich verweisen möchten $?:

if [[ $? = 0 ]]; then
    echo pass
else
    echo fail
fi

1

Aus dem feinen Handbuch fürssh(1) dürfen wir stolpern

EXIT STATUS
     ssh exits with the exit status of the remote command or with 255 if an
     error occurred.

was Ihrer Behauptung zu widersprechen scheint; bei einigen tests kann man feststellen

$ ssh root@10.0.0.60 true; echo $?
0
$ ssh root@10.0.0.60 false; echo $?
1
$ 

(es sei denn, man hat eine Shell-Funktion, die den eigentlichen sshBefehl maskiert ; versuchen Sie, den vollständig qualifizierten Pfad zu verwenden ssh, um dies zu vermeiden.) Dies deutet darauf hin, dass das [[ $? ]]Konstrukt problematisch ist. Dies ist einfach zu testen und zu beweisen

$ true; [[ $? ]] && echo yea
yea
$ false; [[ $? ]] && echo yea
yea
$ 

Man könnte also stattdessen einen Gleichheitstest nach dem Muster von verwenden

$ true; [[ $? -eq 0 ]] && echo yea
yea
$ false; [[ $? -eq 0 ]] && echo yea
$ 
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.