Probar el puerto TCP remoto utilizando telnet ejecutando un comando de una línea

12

Tengo numerosas cajas de Linux con un conjunto muy limitado de comandos y espacio en disco. Pero tiene el telnetcomando sobre él.

Me conecto de forma remota a cada una de estas sondas (mediante programación) y emito un comando linux de línea a través de SSH.

Necesito ejecutar un solo comando para conectarme a una máquina específica, usando telnet, y luego desconectarme de inmediato .

Puedo hacer todo eso, pero la desconexión de inmediato parte. Telnet abre una especie de consola o terminal y no puedo entender un comando de una línea para ejecutar el comando telnet y luego desconectarlo de inmediato.

Si hago eso, puedo analizar fácilmente la salida de texto de los mensajes de error por no poder conectarme a la máquina en el puerto especificado y eso es exactamente lo que estoy buscando.

Entonces, ¿cómo puedo ejecutar un comando de una línea para conectarme a una máquina usando telnet y desconectarme después?

Muhammad Gelbana
fuente
Según tengo entendido, ¿su cliente Telnet no admite el envío directo?
IBr
@IBr, ¿qué quieres decir?
Muhammad Gelbana
Tenga en cuenta que los clientes de telent difieren en el código de salida informado después de que se usa el comando de salida del lado del cliente para terminarlo. Por lo tanto, el código de salida cero no debe considerarse una señal de que el puerto está abierto. No funciona para RHEL telent RPM al menos.
Oliver Gondža

Respuestas:

28

Debería poder canalizar el exitcomando en STDIN telnet. Tratar:

echo 'exit' | telnet {site} {port}

y ver si eso funciona. (parece funcionar en mi servidor web, pero YMMV).

Charles Newey
fuente
puede funcionar pero parece tonto: Telnet debería tener una opción para salir o algo en el primer contacto
Alexander Mills,
10

El método más simple y fácil se da a continuación.

 sleep <n> | telnet <server> <port>

n - El tiempo de espera en segundos antes de la salida automática. Podría ser fraccional como 0.5. Tenga en cuenta que algunos resultados requeridos pueden no devolverse en el tiempo de espera especificado. Por lo tanto, es posible que necesitemos aumentar en consecuencia.

servidor : la IP del servidor de destino o el nombre de host.

puerto : número de puerto del servicio de destino.

También puede redirigir la salida a un archivo como este,

sleep 1 | telnet <server> <port> > output.log
Seff
fuente
Esto funciona perfectamente! Si bien la salida se redirige, noté que todavía obtengo la "Conexión cerrada por un host extranjero". salida en mi consola después de la suspensión en lugar de en el archivo output.log. ¿Alguna manera de prevenir esto?
dan
5

En mi caso esto funciona. (CentOS 7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done
Chuss
fuente
1
Oye, esto es genial. Soy usuario de todos los sistemas Linux en mi trabajo, pero no soy administrador (y no tengo derechos de administrador). Estoy harto de pedirles que instalen telnet todo el tiempo para poder probar la conectividad de la red (soy ingeniero de redes). Esta es una excelente solución. Lo cambié un poco para realizar más como telnet. Proporcioné mi propia respuesta aquí con las modificaciones.
theglossy1
3

Creo que una mejor herramienta para enviar comandos directamente y solo obtener resultados sería netcat. Es una herramienta simple pero poderosa para poner comandos a través de los puertos. Puede ver un ejemplo de uso en esta pregunta de superusuario: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - Asker da un ejemplo de trabajo en el que la conexión se cierra después de unos segundos.

Y si solo desea probar la conectividad, use esto: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/

IBr
fuente
Estoy tratando de instalar netcat en este momento, pero no puedo hacerlo. Descargué una versión compilada de powerpc pero faltaba la biblioteca glibc. ¡Descargué una versión compilada de powerpc pero el dispositivo no tenía suficiente espacio para copiar los archivos de la biblioteca! ¿Es posible que la biblioteca glibc ya exista pero netcat no puede encontrarla?
Muhammad Gelbana
Netcat solo se necesita en el lado del cliente: en el servidor (sonda) puede ser el mismo telnet antiguo.
IBr
También Glibc ya debería existir, se usa en muchas cosas en el sistema habitual.
IBr
Puede intentar agregar a los scripts de telnet para && exitver si se desconecta (al menos en ssh es suficiente).
IBr
&& exitno funcionó Si glibc existiera y creo que sí. ¿Por qué me nc.traditionalquejaría como si faltara?
Muhammad Gelbana
1

Esta es otra versión de la respuesta anterior que hace que actúe un poco más como la sintaxis telnet "normal". Si te gusta mi respuesta, dale un voto positivo no a esto, sino al original.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
theglossy1
fuente
1

Aquí hay una solución que encontré en Internet:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

A mí me funciona en SunOS y HP-UX

Vladimir
fuente
0

Tratar

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

La mejor parte de lo anterior es que también obtienes el estado de salida. Si telnet es exitoso, el código de salida será 0 o si no es 1

Abhishek Kumar
fuente
0

Evite netcat si tiene rutas personalizadas, ya que no obedece las reglas de enrutamiento. Similar a cómo nslookup, dige hostignore el archivo / etc / hosts ( nslookup, dig, firefox ignorando las entradas del archivo / etc / hosts ).

es decir: a diferencia de las aplicaciones y herramientas como telnety /dev/tcp( Probar el puerto TCP remoto usando telnet ejecutando un comando de una línea ) que sigue las reglas de enrutamiento del sistema, ncusa la puerta de enlace predeterminada a menos que se le indique específicamente que use una dirección IP de origen con -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Necesitaba probar si una aplicación podía llegar al recurso, y si las rutas no funcionaban, netcatinformé que todo estaba bien ya que la dirección de origen se había especificado en la prueba. Estoy cambiando a usar /dev/tcp.

legatoproteus
fuente