Ich verwende -w 1
unten, um Timeouts auf 1 Sekunde zu begrenzen. Ich verwende auch -v
aus den in den Kommentaren genannten Gründen. Ich habe -n
verwendet um Verzögerungen für Reverse-DNS-Lookups abzulehnen...
[[email protected] ~]$ for i in $(echo "172.16.1.1,172.16.1.5"|tr "," "\n"); do echo -e "22\n80\n443\n8080" | xargs -i nc -w 1 -zvn $i {}; done
(UNKNOWN) [172.16.1.1] 22 (ssh) open
(UNKNOWN) [172.16.1.1] 80 (www) : Connection timed out
(UNKNOWN) [172.16.1.1] 443 (https) open
(UNKNOWN) [172.16.1.1] 8080 (http-alt) : Connection timed out
(UNKNOWN) [172.16.1.5] 22 (ssh) open
(UNKNOWN) [172.16.1.5] 80 (www) open
(UNKNOWN) [172.16.1.5] 443 (https) open
(UNKNOWN) [172.16.1.5] 8080 (http-alt) : Connection refused
[[email protected] ~]$
Wenn Sie GNU Parallel genauso mögen wie ich, versuchen Sie Folgendes:
parallel nc -vz host ::: 22 80 443 8080
Beispielausgabe:
Connection to foo.example.com 22 port [tcp/ssh] succeeded!
nc: connect to foo.example.com port 80 (tcp) failed: Connection refused
nc: connect to foo.example.com port 443 (tcp) failed: Connection refused
nc: connect to foo.example.com port 8080 (tcp) failed: Connection refused
Diese Methode ist in einigen Fällen auch schneller, da sie die Verbindung zu Ports parallel und nicht seriell testet. Dies wäre insbesondere der Fall, in dem der entfernte Host (oder die eingreifende Firewall) Ihre Pakete verwirft, um getarnt zu bleiben (im Gegensatz zu einer erfolgreichen Verbindung oder einer erzwungenen Ablehnung).
Tipp: In den meisten Linux-Distributionen können Sie parallel
installieren von Ihrem Paketmanager.
Aktualisierung: Mit parallel
, lässt sich dies sehr gut verallgemeinern, um einen häufig benötigten Fall mehrerer Hosts x mehrerer Ports abzudecken. Das folgende Beispiel verwendet parallel
um über das Kreuzprodukt zu iterieren, sodass Sie keine verschachtelten Schleifen schreiben müssen.
parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080
Ausgabe:
Connection to host1 22 port [tcp/ssh] succeeded!
Connection to host1 80 port [tcp/http] succeeded!
Connection to host1 443 port [tcp/https] succeeded!
nc: connect to host1 port 8080 (tcp) failed: Connection refused
Connection to host2 22 port [tcp/ssh] succeeded!
nc: connect to host2 port 80 (tcp) failed: Connection refused
nc: connect to host2 port 443 (tcp) failed: Connection refused
nc: connect to host2 port 8080 (tcp) failed: Connection refused
Connection to host3 22 port [tcp/ssh] succeeded!
nc: connect to host3 port 80 (tcp) failed: Connection refused
nc: connect to host3 port 8080 (tcp) failed: Connection refused
nc: connect to host3 port 443 (tcp) failed: Connection refused
Wie im vorherigen Beispiel parallel
führt die Verbindungstests parallel durch. Beachten Sie, dass die Standardparallelität darin besteht, wie viele Threads Ihr System hat, kann aber einfach mit -j
überschrieben werden auf einen beliebigen Wert umschalten. Sie könnten leicht mit parallel -j 50 ...
davonkommen oder sogar noch höher, da das Testen von Sockets keine CPU-intensive Aufgabe ist.