A partir de un script bash, ¿cómo puedo averiguar rápidamente si un puerto 445
está abierto / escuchando en un servidor?
He probado un par de opciones, pero quiero algo rápido:
1. lsof -i :445
(Toma segundos)
2. netstat -an |grep 445 |grep LISTEN
(Toma segundos)
3. telnet
(no regresa)
4. nmap
, netcat
no están disponibles en el servidor
Será bueno saber de una manera que no enumere primero y greps después de eso.
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.Respuestas:
Una sorpresa que descubrí recientemente es que Bash admite de forma nativa conexiones tcp como descriptores de archivos . Usar:
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:
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.
fuente
/dev/tcp/IP/PORT
árbolAquí hay una muy corta con "respuesta rápida": ¿Cómo probar si el puerto TCP remoto se abre desde el script de Shell?
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
p.ej
fuente
Puede usar netstat de esta manera para obtener resultados mucho más rápidos:
En Linux:
En Mac:
Esto generará una lista de procesos que escuchan en el puerto (445 en este ejemplo) o no generará nada si el puerto está libre.
fuente
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
awk '$6 == "LISTEN" && $4 ~ "80$"'
. En lugar de verificar el punto antes del número de puerto con\.80
, solía80$
. De lo contrario, esto también coincide con las direcciones IP que contienen.80
y los puertos que comienzan con80
, por ejemplo8000
,.Puedes usar netcat para esto.
se conecta al servidor y cierra la conexión directamente nuevamente. 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,
devolverá 0 si y solo si netcat podría conectarse con éxito al puerto.
fuente
nc
tiene la-z
bandera para este propósito, que no requiere tomar entrada de/dev/null
. Ya hay una respuesta usando la-z
bandera de arriba.Basado en la respuesta de Spencer Rathbun, usando bash:
fuente
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
están listados en / proc / net / tcp.
es la segunda columna, después de ":", en hexadecimal:
así que supongo que uno de los
:50
de la tercera columna debe ser stackoverflow: o)mira
man 5 proc
para más detalles. y elegir eso aparte con sed, etc. se deja como un ejercicio para el lector amable ...fuente
¿2 ms es lo suficientemente rápido?
Agregue los dos puntos y esto funciona en Linux
fuente
ss
es incluso un poco más rápido quenc
.l
es para escuchar ,4
es para IPv4;sport
significa (por supuesto) el puerto de origen . El comando anterior supone un puerto TCP de escucha (t
opción): use lau
opción para UDP, o ninguno de ellos para ambos protocolos. Más información sobress
como siempre en Nixcraft . NOTA: losss
filtros no funcionan aquí, no sé por qué (bash 4.3.11, ss utility, iproute2-ss131122), tienen que ir con grep .ss
comando no devuelva un código de salida que refleje su hallazgo; siempre devuelve 0 código de salida.| grep LISTEN
?State Recv-Q Send-Q Local Address:Port Peer Address:Port
y ahora? ¿Qué significa esto?Aquí hay uno que funciona tanto para Mac como para Linux:
fuente
[\\.\:]
.Donde 8000 es el número de puerto. Si el puerto está libre, iniciará un servidor que puede cerrar fácilmente. Si no es así, arrojará un error:
fuente
Quería verificar si un puerto está abierto en uno de nuestros servidores de prueba de Linux. Pude hacerlo intentando conectarme con telnet desde mi máquina de desarrollo al servidor de prueba. En su máquina de desarrollo, intente ejecutar:
En este ejemplo, quiero verificar si el puerto 8080 está abierto en el host test2.host.com
fuente
tcping es una gran herramienta con una sobrecarga muy baja. También tiene un argumento de tiempo de espera para hacerlo más rápido:
fuente
También puedes usar el comando netcat
o
-z: establece nc para simplemente escanear en busca de demonios, sin enviarles ningún dato.
-v: habilita el modo detallado.
fuente
nmap
es la herramienta correcta Simplemente usenmap example.com -p 80
Puede usarlo desde un servidor local o remoto. También le ayuda a identificar si un firewall está bloqueando el acceso.
fuente
Si estás usando iptables prueba:
o
fuente