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