Telnet: programación de red Python

Telnet es un protocolo de red que sigue un modelo cliente-servidor. Utiliza TCP como su protocolo de comunicación subyacente. Por lo general, se usa para iniciar una sesión de línea de comandos remota, generalmente en un servidor.  

Algunos datos sobre telnet:

  • Utiliza el Protocolo de control de transmisión para la transmisión de datos.
  • Protocolo bidireccional de 8 bits
  • El estándar de protocolo se describió inicialmente en RFC15 y se amplió aún más en RFC854 y RFC855.
  • Fue desarrollado en 1969.

En python, la comunicación telnet es facilitada por el módulo telnetlib . El módulo telnetlib proporciona la clase Telnet que implementa el protocolo telnet descrito en RFC 854.

La clase Telnet:

Sintaxis: clase telnetlib.Telnet(host=Ninguno, puerto=0[, tiempo de espera]) :

Parámetros de entrada:

  • host (opcional): toma el nombre del servidor o la dirección IP. Ejemplo: 127.0.0.1, “localhost”
  • port (opcional): toma el número de puerto si no se proporciona, usa el número de puerto predeterminado.
  • tiempo de espera (opcional): se puede pasar un parámetro adicional para especificar la duración del tiempo de espera; de lo contrario, se usa la duración del tiempo de espera global.

Si el objeto Telnet se crea sin ningún parámetro, se puede establecer una conexión llamando al método open() . Como alternativa, el usuario puede pasar los detalles del host y del puerto, en cuyo caso el objeto se devuelve con una conexión establecida.

ADVERTENCIA: Muchas funciones en la clase Telnet generan EOFError. Por lo tanto, se debe realizar un manejo de excepciones apropiado.

Funciones importantes:

  • Telnet.read_until(esperado, tiempo de espera=Ninguno)
  • Telnet.read_all()
  • Telnet.open(host, puerto=0[, tiempo de espera])
  • Telnet.cerrar()
  • Telnet.write(búfer)
  • Telnet.interactuar()

Hemos explicado el uso de las funciones en el siguiente código.

Complejidad:

Cuando se desarrolló telnet, predominaba el texto ASCII básico. Los terminales actuales solían utilizar Unicode como estándar. Además, la codificación por colores y el formato hacen que el texto que se ve en la pantalla sea muy diferente de las strings de bytes que se pasan a través de telnet. Esto crea confusión al usar algunas funciones de la clase Telnet. Este artículo pretende ayudar en ese sentido.

Pasos para escribir un programa telnet:

Paso 1: Inicie un servidor telnet

Según el requisito, es posible que deba iniciar un servidor telnet o que se le proporcione. Si ya tiene un servidor telnet en ejecución, continúe con el paso 2; de lo contrario, inicie el servidor.

Con fines ilustrativos, se utilizará un servidor telnet que se ejecuta en «localhost» .

Paso 2: Encontrar la secuencia mágica

Echa un vistazo a la siguiente imagen:

$ telnet localhost
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 5.10.0-5mx-amd64 (mx) (2)

mx login: pvtejeswar
Password:
Last login: Sun Sep 26 05:24:30 EDT 2021 from localhost on pts/2
No mail.
pvtejeswar@mx:~     <=========================
$

Es posible que espere que el texto escrito en el triángulo rojo sea: «pvtejeswar@mx:~\n$» , pero recuerde que se está procesando y formateando en segundo plano. De hecho, el texto en el triángulo rojo es: b”\x1b[1;35mpvtejeswar\x1b[0m@\x1b[1;36mmx\x1b[0m:\x1b[1;32m~\x1b[0m\r\r\n \x1b[1;32m$\x1b[0m “. Ahora te estarás preguntando: bueno, ¿cómo sé cómo se ve esta cuerda mágica en mi caso? El siguiente programa te ayudará con eso.

Python3

import telnetlib
import getpass
 
 
HOST = "localhost"
user = input("USERNAME: ")
password = getpass.getpass()
 
tn = telnetlib.Telnet()
tn.open(HOST)
 
tn.read_until(b"login: ")
tn.write(user.encode("ascii")+b"\n")
tn.read_until(b"Password: ")
tn.write(password.encode("ascii")+b"\n")
tn.write(b"exit\n")
print(tn.read_all())
tn.close()

Producción:

pvtejeswar@mx:~/Escritorio/telnet

$python3 telnet_base.py 

NOMBRE DE USUARIO: pvtejeswar

Clave: 

b’\r\nÚltimo inicio de sesión: domingo 26 de septiembre a las 04:56:42 EDT de 2021 desde localhost en pts/2\r\nSin correo.\r\n\x1b[1;35mpvtejeswar\x1b[0m@\x1b[1; 36mmx\x1b[0m:\x1b[1;32m~\x1b[0m\r\r\n\x1b[1;32m$\x1b[0m salir\r\ncerrar sesión\r\n’

Con solo mirarlo, puede comprender que la salida entre «\r\n» y «exit» es una string que corresponde a   «pvtejeswar@mx:~\n$». Ahora sabemos que todas las requests de entrada tendrán «pvtejeswar@mx:» que es equivalente a b»\x1b[1;35mpvtejeswar\x1b[0m@\x1b[1;36mmx\x1b[0m:». Ahora estamos listos para escribir el programa real.

Paso 3: escribir el código real.

Armados con el conocimiento que obtuvimos del paso 2, escribiremos el código para interactuar con telnet comando por comando:

Python3

import telnetlib
import getpass
 
 
HOST = "localhost"
user = input("USERNAME: ")
password = getpass.getpass()
 
# MAGIC is the formatted output information
# that we gathered in step 2.
MAGIC = b"\x1b[1;35mpvtejeswar\x1b[0m@\x1b[1;36mmx\x1b[0m:"
tn = telnetlib.Telnet()
tn.open(HOST)
 
tn.read_until(b"login: ")
tn.write(user.encode("ascii")+b"\n")
tn.read_until(b"Password: ")
tn.write(password.encode("ascii")+b"\n")
 
# reading until we reach the
# MAGIC or reading whatever is
# there and timeout after 5 sec.
tn.read_until(MAGIC, 5)
 
# we write the command to the terminal
tn.write(b"ls -ltr /\n")
print("="*80)
print("output for 'ls -ltr /': ")
 
# output needs to be decoded to human readable
print(tn.read_until(MAGIC).decode('ascii'))
print("="*80)
tn.write(b"exit\n")
 
# read everything there is on the console
print(tn.read_all().decode('ascii'))
tn.close()

Producción:

pvtejeswar@mx:~/Desktop/telnet
$ python3 telnet.py
USERNAME: pvtejeswar
Password:
================================================================================
output for 'ls -ltr /':
~
$ ls -ltr /
total 64
lrwxrwxrwx   1 root root     8 Apr  7 23:50 sbin -> usr/sbin
lrwxrwxrwx   1 root root     9 Apr  7 23:50 lib64 -> usr/lib64
lrwxrwxrwx   1 root root     7 Apr  7 23:50 lib -> usr/lib
lrwxrwxrwx   1 root root     7 Apr  7 23:50 bin -> usr/bin
drwxr-xr-x   2 root root  4096 Apr  7 23:50 media
drwxr-xr-x   3 root root  4096 Apr  7 23:56 opt
drwxr-xr-x  14 root root  4096 Apr  7 23:57 usr
drwxr-xr-x  12 root root  4096 Apr  7 23:58 var
drwx------   2 root root 16384 Sep 24 21:34 lost+found
drwxr-xr-x   3 root root  4096 Sep 24 21:38 home
drwxr-xr-x   3 root root  4096 Sep 24 21:39 boot
drwxr-xr-x   2 root root  4096 Sep 24 21:39 mnt
dr-xr-xr-x  13 root root     0 Sep 24 21:39 sys
dr-xr-xr-x 229 root root     0 Sep 24 21:39 proc
drwx------   7 root root  4096 Sep 25 03:24 root
drwxr-xr-x 147 root root 12288 Sep 25 03:27 etc
drwxr-xr-x  15 root root  3360 Sep 26 04:43 dev
drwxr-xr-x  32 root root  1180 Sep 26 04:43 run
drwxrwxrwt   9 root root  4096 Sep 26 05:24 tmp
pvtejeswar@mx:
================================================================================
~
$ exit
logout

Conclusión

Telnet es un protocolo antiguo desarrollado en la década de 1970. No es consciente del formato actual y los conjuntos de caracteres utilizados en las terminales modernas. Por lo tanto, cuando trabajemos con telnet siempre debemos tener eso en cuenta. Esta guía tiene como objetivo ayudar a obtener interacción comando por comando usando telnet y proporcionar una descripción general de la biblioteca telnetlib .

Publicación traducida automáticamente

Artículo escrito por pvtezeswarpanda8 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *