estoy usando -w 1
a continuación para limitar los tiempos de espera a 1 segundo. También uso -v
por las razones mencionadas en los comentarios. Usé -n
para rechazar los retrasos en las búsquedas DNS inversas...
[[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] ~]$
Si te gusta GNU Parallel tanto como a mí, prueba esto:
parallel nc -vz host ::: 22 80 443 8080
Salida de muestra:
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
Este método también es más rápido en algunos casos, ya que prueba la conexión a puertos en paralelo, no en serie. Específicamente, aquí sería donde el host remoto (o el cortafuegos que interviene) descarta sus paquetes para permanecer ocultos (a diferencia de una conexión exitosa o un rechazo forzoso).
Consejo: en la mayoría de las distribuciones de Linux, puede instalar parallel
de su administrador de paquetes.
Actualización: Con parallel
, esto se generaliza muy bien para cubrir un caso a menudo necesario de múltiples hosts x múltiples puertos. El siguiente ejemplo usa parallel
para iterar sobre el producto cruzado, por lo que no necesita escribir ningún bucle anidado.
parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080
Salida:
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
Al igual que el ejemplo anterior, parallel
ejecuta las pruebas de conexión en paralelo. Tenga en cuenta que el paralelismo predeterminado es cuántos subprocesos tiene su sistema, pero puede anularse fácilmente con el -j
cambiar a cualquier valor. Podrías salirte con la tuya fácilmente con parallel -j 50 ...
o incluso más, ya que probar los sockets no es una tarea intensiva de la CPU.