GNU/Linux >> Tutoriales Linux >  >> Linux

¿Probar eficientemente si un puerto está abierto en Linux?

Una sorpresa que descubrí recientemente es que Bash admite de forma nativa conexiones tcp como descriptores de archivos. Para usar:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

Estoy usando 6 como descriptor de archivo porque 0,1,2 son stdin, stdout y stderr. Bash a veces usa 5 para procesos secundarios, por lo que 3,4,6,7,8 y 9 deberían ser seguros.

Según el comentario a continuación, para probar la escucha en un servidor local en un guión:

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

Para determinar si alguien está escuchando, intente conectarse por loopback. Si falla, entonces el puerto está cerrado o no se nos permite el acceso. Luego, cierre la conexión.

Modifique esto para su caso de uso, como enviar un correo electrónico, salir del script en caso de falla o iniciar el servicio requerido.


Hay una muy breve con "respuesta rápida" aquí:¿Cómo probar si el puerto TCP remoto se abre desde el script de Shell?

nc -z <host> <port>; echo $?

Lo uso con 127.0.0.1 como dirección "remota".

esto devuelve "0" si el puerto está abierto y "1" si el puerto está cerrado

por ejemplo

nc -z 127.0.0.1 80; echo $?

-z Especifica que nc solo debe escanear en busca de demonios de escucha, sin enviarles ningún dato. Es un error usar esta opción junto con la opción -l.


Puede usar netstat de esta manera para obtener resultados mucho más rápidos:

En Linux:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

En Mac:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

Esto generará una lista de procesos que escuchan en el puerto (445 en este ejemplo) o no generará nada si el puerto está libre.


Puedes usar netcat para esto.

nc ip port < /dev/null

se conecta al servidor y directamente cierra la conexión de nuevo. Si netcat no puede conectarse, devuelve un código de salida distinto de cero. El código de salida se almacena en la variable $?. Como ejemplo,

nc ip port < /dev/null; echo $?

devolverá 0 si y solo si netcat pudo conectarse con éxito al puerto.


Linux
  1. Telnet a un puerto para probar la conectividad de la red

  2. Cómo cambiar el puerto SSH en Linux

  3. Cómo probar la conectividad del puerto [TCP/UDP] desde un servidor Linux

  4. ¿Verificar si el puerto está abierto o cerrado en un servidor Linux?

  5. Agotamiento del puerto de red de Linux

Cómo encontrar y cerrar puertos abiertos en Linux

Cómo usar Netcat para escanear puertos abiertos en Linux

Cómo hacer ping a un número de puerto en Linux

Cómo abrir un PDF en la terminal de Linux

Abrir un puerto en Linux

Todas las formas de verificar si un puerto está abierto en Linux