Ich versuche zu verstehen, was das grep -v grep
Folgende bewirkt:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
Oder gibt es eine bessere Möglichkeit, einen TCP-Verbindungstest zu finden?
Antwort1
Wenn Sie überprüfen möchten, ob Sie innerhalb von 5 Sekunden eine SSH-Verbindung herstellen und einen Befehl ausführen können, gehen Sie wie folgt vor:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then
printf '%s\n' "$server is up"
fi
Ihr Befehl macht in dieser Form wenig Sinn. Da Sie keinen Befehl zur Ausführung auf dem Remote-Server angeben, ssh
wird er in dem Modus ausgeführt rlogin
, in dem ein Pseudo-Terminal angefordert und die Login-Shell des Remote-Benutzers gestartet wird (oder möglicherweise ein ForcedCommand).
Anschließend wenden Sie mehrere Filter auf die Ausgabe an:
grep -v "Connection refused"
: Filtern Sie alle Zeilen aus demAusgabedas enthältConnection refused
. Das macht wenig Sinn, da die Fehlermeldung, wenn sie erscheinen würde, auf stderr geschrieben würde und nicht auf die gefilterte Standardausgabegrep
, und außerdem, weil:grep "Connected to"
: Wählen Sie nur die Zeilen aus, die enthaltenConnected to
. Dadurch werden auch die Zeilen ausgeschlossen, die enthaltenConnection refused
, da es unwahrscheinlich ist, dass eine Zeile beides enthält.grep -v grep
, entfernen Sie auch die Zeilen, die enthaltengrep
(das wären also Zeilen, die sowohl alsConnected to
auchgrep
als auch nicht enthaltenConnection refused
!)wc -l
: Zählen Sie die Anzahl der resultierenden Zeilen (also die Zeilen inssh
der Standardausgabe von , die enthalten,Connected to
außer denen, die auchgrep
oder enthaltenConnection refused
). Beachten Sie, dasswc
diese Zahl nur ausgegeben wird, wenn die Verbindung geschlossen wird, wenn die Shell-Sitzung beendet wurde, z. B. wenn der Benutzer eingibtexit
. Da der Benutzer jedoch keine Ausgabe sieht (da alleswc
irgendwann an geht), hat er kaum eine Ahnung, dass er eingeben muss,exit
um diese Sitzung zu beenden.
Antwort2
Es schließt alle Zeilen aus, die die Buchstabenfolge grep
aus der vorherigen Pipe-Ausgabe enthalten.