Sto usando -w 1
di seguito per limitare i timeout a 1 secondo. Uso anche -v
per i motivi citati nei commenti. Ho usato -n
rifiutare i ritardi per le ricerche DNS inverse...
[[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] ~]$
Se ti piace GNU Parallel tanto quanto me, prova questo:
parallel nc -vz host ::: 22 80 443 8080
Esempio di output:
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
Questo metodo è anche più veloce in alcuni casi poiché sta testando la connessione alle porte in parallelo, non seriale. Nello specifico, questo sarebbe il punto in cui l'host remoto (o il firewall intervenuto) scarta i tuoi pacchetti per rimanere nascosti (al contrario di una connessione riuscita o di un rifiuto forzato).
Suggerimento: nella maggior parte delle distribuzioni Linux, puoi installare parallel
dal tuo gestore di pacchetti.
Aggiornamento: Con parallel
, questo si generalizza molto bene per coprire un caso spesso necessario di più host x più porte. L'esempio seguente utilizza parallel
per iterare sul prodotto incrociato, quindi non è necessario scrivere alcun ciclo nidificato.
parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080
Uscita:
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
Proprio come l'esempio precedente, parallel
esegue i test di connessione in parallelo. Nota, il parallelismo predefinito è quanti thread ha il tuo sistema, ma può essere facilmente sovrascritto con -j
passare a qualsiasi valore. Potresti cavartela facilmente con parallel -j 50 ...
o anche superiore poiché il test dei socket non è un'attività che richiede molta CPU.