windows - tag - Verificar el estado de un puerto en el host remoto
tag spaces (8)
Necesito una línea de comando que pueda verificar el estado del puerto en un host remoto. Intenté hacer ping xxx.xxx.xxx.xxx:161
pero no reconoce el "host". Pensé que era una respuesta "buena" 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 remota del puerto nuevamente, luego el comando que usa ese puerto en el siguiente servidor para obtener información , y así. Miré a 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 una risa, 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 de Perl están extremadamente oxidadas (lo usa o lo pierde), no conozco ningún otro idioma basado en Windows, excepto el lote. Unix es mi habilidad, pero esto debe ejecutarse desde Widows Server 2003.
Creo que estás buscando Hping ( http://www.hping.org/ ), que tiene una versión de Windows.
"La interfaz está inspirada en el comando ping (8) Unix, 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á siendo bloqueado (como por un firewall), donde ICMP podría no estar.
En Bash, puede usar archivos de pseudodispositivos que pueden abrir una conexión TCP al socket asociado. La sintaxis es /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 un sitio web específico es accesible:
$ 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 scripts de Bash: Capítulo 29. /dev
y /proc
Relacionado: prueba si un puerto en un sistema remoto es alcanzable (sin telnet) en SU
En 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, click . Desde el artículo vinculado, habilite telnet a través del panel de control -> programas y características -> características de Windows -> telnet cliente, o simplemente ejecútelo en un indicador de administrador:
dism /online /Enable-Feature /FeatureName:TelnetClient
Para propósitos de scripting, he encontrado que el comando curl
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 funcionará para todos los servicios, ya que curl
puede 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ó -m5
para establecer el tiempo máximo de conexión de 5 segundos.
Si desea verificar también si el host es válido, también debe verificar el código de salida 6
:
$ 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:port
, eg:
$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused
Consulte: man curl
para obtener una lista completa de los códigos de salida.
Presione Windows + R escriba cmd
y Enter
En el símbolo del sistema, escriba
telnet "machine name/ip" "port number"
Si el puerto no está abierto, aparecerá este mensaje:
"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)
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
nc o ''netcat'' también tiene un modo de escaneo que puede ser útil.