Una sorpresa que descubrí recientemente es que Bash admite de forma nativa conexiones tcp como descriptores de archivos . 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 script:
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 mediante 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 error o iniciar el servicio requerido.
netstat -lnt
(con-t
y sin-a
) limitará la salida a escuchar solo conexiones TCP. Puede acelerarse un poco. Puede agregar-4
para IPv4 solo si no necesita IPv6.netstat -an | grep PORTNUMBER | grep -i listen
Si la salida está vacía, el puerto no está en uso.lsof
es lento para usted, pero normalmente es la mejor de las soluciones que enumeró. Sunetstat
solución no es muy confiable (puede adivinarla siempre que la usegrep
; de todos modos, devuelve verdadero si alguien está escuchando, por ejemplo, 4450).telnet
enetcat
intenta crear una conexión, que no siempre es lo que quieres.