Používám -w 1
níže pro omezení časových limitů na 1 sekundu. Také používám -v
z důvodů uvedených v komentářích. Použil jsem -n
odmítnout zpoždění pro zpětné vyhledávání DNS...
[[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] ~]$
Pokud máte rádi GNU Parallel stejně jako já, zkuste toto:
parallel nc -vz host ::: 22 80 443 8080
Ukázkový výstup:
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
Tato metoda je také v některých případech rychlejší, protože testuje připojení k portům paralelně, nikoli sériově. Konkrétně by to bylo místo, kde vzdálený hostitel (nebo intervenující firewall) zahodí vaše pakety, aby zůstal utajený (na rozdíl od úspěšného připojení nebo násilného odmítnutí).
Tip: ve většině distribucí Linuxu můžete nainstalovat parallel
od správce balíčků.
Aktualizace: S parallel
, to velmi dobře zobecňuje, aby pokrylo často potřebný případ více hostitelů x více portů. Následující příklad používá parallel
iterovat přes křížový produkt, takže nemusíte psát žádné vnořené smyčky.
parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080
Výstup:
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
Stejně jako v předchozím příkladu parallel
paralelně provádí testy připojení. Všimněte si, že výchozí paralelismus je počet vláken, které má váš systém, ale lze je snadno přepsat pomocí -j
přepnout na libovolnou hodnotu. S parallel -j 50 ...
byste mohli snadno uniknout nebo dokonce vyšší, protože testování soketů není náročný úkol na CPU.