Ich versuche zu verstehen, was grep -v grep
unten tut:
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?
Kommentare
- Bitte konsultieren Sie das nächste Mal zuerst die Manpages. In diesem Fall
man grep
Antwort
Alle Zeilen, die die Buchstabenfolge grep
enthalten, werden von der vorherigen Pipe-Ausgabe ausgeschlossen.
Antwort
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 einfach 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 wenig Sinn. Da Sie keinen Befehl zum Ausführen auf dem Remote-Server angeben, wird ssh
im rlogin
-Modus, in dem ein Pseudo-Terminal angefordert und die Anmeldeshell des Remote-Benutzers gestartet wird (oder möglicherweise a ForcedCommand).
Anschließend wenden Sie mehrere Filter auf die Ausgabe an:
-
grep -v "Connection refused"
: Filtern Sie eine beliebige Zeile aus die Ausgabe , dieConnection refused
enthält. Dies ist wenig sinnvoll, da diese Fehlermeldung, wenn sie angezeigt wird, auf stderr geschrieben wird, nicht auf die Standardausgabe, diegrep
filtert, und auch, weil: -
grep "Connected to"
: Wählen Sie nur die Zeilen aus, dieConnected to
enthalten. Dies würde auch die Zeilen ausschließen, dieConnection refused
enthalten, da es unwahrscheinlich ist, dass eine Zeile beide enthält. -
grep -v grep
Entfernen Sie auch die Zeilen, diegrep
enthalten (dies wären also Zeilen, die sowohlConnected to
als auchgrep
und nichtConnection refused
!) -
wc -l
: Zählen Sie die Anzahl der resultierenden Zeilen (also die Zeilen) inssh
„s stdout, dieConnected to
enthalten, außer solchen, die auchgrep
oderConnection refused
). Beachten Sie, dasswc
diese Nummer nur ausgibt, wenn die Verbindung geschlossen wird, wenn die Shell-Sitzung beendet wurde, z. B. wenn der Benutzerexit
eingibt . Da der Benutzer jedoch keine Ausgabe sieht (da alles irgendwann anwc
geht), hat der Benutzer wenig Ahnung, dass er , um diese Sitzung zu beenden.