Verifique el estado de un puerto en el host remoto [cerrado]

158

Necesito una línea de comando que pueda verificar el estado del puerto en un host remoto. Lo intenté ping xxx.xxx.xxx.xxx:161pero no reconoce el "host". Pensé que era una "buena" respuesta hasta que hice el mismo comando contra un host que sé que tiene ese puerto abierto. Esto es para un archivo por lotes en Windows que verificará el estado del puerto remoto y luego ejecutará un comando que usa ese puerto remoto para obtener información, luego el comando de verificación de puerto remoto nuevamente, luego el comando que usa ese puerto en el siguiente servidor para obtener información , y así. He buscado en todas partes y pensé que el ping podría hacerlo, pero debe haber varias versiones de ping, supongo que el servidor en el que estoy haciendo esto no muestra esa opción.

Solo por risas, probé un comprobador de puerto remoto basado en la web desde un sitio web, y los resultados fueron correctos tanto para el servidor "problemático" como para el servidor correcto. Sin embargo, no puedo usar eso en una ejecución por lotes con más de 500 IP de servidor.

¿Hay algo que pueda hacer que sea simple? Mis habilidades en Perl son extremadamente oxidadas (úsalas o piérdelas), no conozco ningún otro idioma basado en Windows, excepto el lote. Unix es mi habilidad, pero esto debe ejecutarse desde Widows Server 2003.

Ross Ridge
fuente
55
Es posible que desee intentar preguntar esto en serverfault.com
John Rasch
1
Como esta pregunta está cerrada, he respondido aquí
npocmaka
windows ps> tnc xxx.xxx.xxx.xxx -port 161
musulmán Shahsavan

Respuestas:

151

Parece que está buscando un escáner de puertos como nmap o netcat , los cuales están disponibles para Windows, Linux y Mac OS X.

Por ejemplo, busque telnet en una ip conocida:

nmap -A 192.168.0.5/32 -p 23

Por ejemplo, busque puertos abiertos del 20 al 30 en host.ejemplo.com:

nc -z host.example.com 20-30
Glenn
fuente
Ambos están disponibles para Windows.
Glenn
1
su comando nmap debería ser real "-p23" sin el espacio. nmap trata cada unidad no precedida inmediatamente por una bandera como un destino de escaneo separado
Brandon Lebedev
14
debería ser nc -zv host.example.com 20-30. de lo contrario no hay salida
Aryeh Beitz
1
La opción -zpara ncno está disponible en Linux.
valentin_nasta
1
@valentin_nasta sí, lo es, tal vez dependiendo de qué versión de netcat esté usando (gnu u openbsd). Aquí está la línea relevante de la página de manual para nc (versión openbsd) en mi sistema Arch Linux: -z Especifica que nc solo debe escanear en busca de demonios, sin enviarles ningún dato. Es un error utilizar esta opción junto con la opción -l
pgoetz
126

En el símbolo del sistema, puede usar el comando telnet. Por ejemplo, para conectarse a IP 192.168.10.1 con el puerto 80,

telnet 192.168.10.1 80

Para habilitar telnet en Windows 7 y superior, haga clic en . Desde el artículo vinculado, habilite telnet a través del panel de control -> programas y características -> características de windows -> cliente telnet, o simplemente ejecute esto en un indicador de administrador:

dism /online /Enable-Feature /FeatureName:TelnetClient
Naveen Yedugani
fuente
3
Este es el método más fácil si telnet está instalado en el dispositivo Windows
usuario de linux shonky el
30
... y toma 2 segundos agregarlo a Windows (8.1 en mi caso)> Panel de control> Agregar programas> Activar las funciones de Windows
Chris Moutray
14
Solo para información: si el puerto no está abierto: Conectando a ##### ... No se pudo abrir la conexión al host, en el puerto ####: Falló la conexión; Y si el puerto está abierto, terminarás en telnet (CTRL +] y luego 'salir')
blackstrype
27

Para fines de secuencias de comandos, descubrí que el curlcomando puede hacerlo, por ejemplo:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Posiblemente no funcione para todos los servicios, ya que curlpuede devolver diferentes códigos de error en algunos casos (según el comentario), por lo que agregar la siguiente condición podría funcionar de manera confiable:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Nota: Se agregó -m5para establecer un tiempo de espera de conexión máximo de 5 segundos.

Si desea verificar también si el host es válido, también debe verificar el 6código de salida:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Para solucionar el código de error devuelto, simplemente ejecute: curl host:portpor ejemplo:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Ver: man curlpara la lista completa de códigos de salida.

kenorb
fuente
Desafortunadamente, esto no funciona para mí (al menos en bash en OS X).
Mike Atlas
1
Un servicio a medida. FWIW funciona más o menos: curl $IP:$PORTproduce: curl: (52) Empty reply from server(versus curl: (7) Failed to connect) pero, al igual que nc, no puedo | grep Emptypara estas declaraciones de salida como uno podría esperar (¿algo sobre nuevas líneas o falta de salida inmediata?). Supongo que su línea es condicional basada en el código de salida, ¿verdad? Estoy en El Cap; tal vez en otras versiones o sistemas operativos, el estado de falla sale en -1lugar de 52?
Mike Atlas
Sí, eso lo haría curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas
La pregunta era sobre Windows, que obviamente no tiene, por ejemplo, / dev / null
Arthur Tacca
@ArthurTacca Siempre puede usar Windows Subsystem para Linux (WSL).
kenorb
23

Presione Windows+ Rtipo cmdyEnter

En el símbolo del sistema, escriba

telnet "machine name/ip" "port number"

Si el puerto no está abierto, este mensaje mostrará:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

De lo contrario, accederá al puerto abierto (se mostrará una pantalla vacía)

León
fuente
77
Tenga en cuenta que telnet no está instalado por defecto en los sistemas modernos de Windows. Deberá instalarlo desde el panel de control Agregar o quitar características de Windows.
Greg
1
@Greg o usando una herramienta en línea como telnet-online.net
oz
2
@oz verdadero, a menos que esté verificando el estado de un servidor interno
Greg
funciona en Windows 10
Gaurav
19

Use el comando nc,

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

También puedes usar el comando telnet

telnet <ip/host> port
minhas23
fuente
4

nc o 'netcat' también tiene un modo de escaneo que puede ser útil.

caskey
fuente
3
En Mac "nc -zv server port-range"
Vijay Kumar
2

Creo que estás buscando Hping ( http://www.hping.org/ ), que tiene una versión de Windows.

"La interfaz está inspirada en el comando unix ping (8), pero hping no solo puede enviar solicitudes de eco ICMP. Es compatible con TCP, UDP, ICMP ..."

También es muy útil si desea ver a lo largo de una ruta que un puerto TCP está bloqueado (como por un firewall), donde ICMP podría no estar.

Sangre verdadera
fuente
2

En Bash, puede usar archivos de pseudodispositivos que pueden abrir una conexión TCP al socket asociado. La sintaxis es la siguiente /dev/$tcp_udp/$host_ip/$port.

Aquí hay un ejemplo simple para probar si Memcached se está ejecutando:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

Aquí hay otra prueba para ver si se puede acceder a un sitio web específico:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Para obtener más información, consulte: Guía avanzada de secuencias de comandos Bash: Capítulo 29. /devy/proc .

Relacionado: Pruebe si un puerto en un sistema remoto es accesible (sin telnet) en SuperUser.

Para obtener más ejemplos, consulte: Cómo abrir un socket TCP / UDP en un shell bash (artículo).

kenorb
fuente
1
Wow, esto es genial! No sé si esto es posible con solo bash. Muy conveniente para personas como yo que solo tienen instalado git bash en Windows y no desean instalar otro servicio.
dotslashlu