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.