2012-06-08 28 views
10

así que estoy tratando esto realmente simple ejemplo dado por la documentación de Python:telnetlib ejemplo pitón

import getpass 
import sys 
import telnetlib 

HOST = "<HOST_IP>" 
user = raw_input("Enter your remote account: ") 
password = getpass.getpass() 

tn = telnetlib.Telnet(HOST) 

tn.read_until("login: ") 
tn.write(user + "\n") 
if password: 
    tn.read_until("Password: ") 
    tn.write(password + "\n") 

tn.write("ls\n") 
tn.write("exit\n") 
print tn.read_all() 

Mi problema es que se cuelga al final de la read_all() ... No se imprime cualquier cosa fuera Nunca he usado este módulo antes, así que estoy intentando que este ejemplo realmente básico funcione antes de continuar. Por cierto, estoy usando Python 2.4 Gracias.

Respuesta

8

Bien, encontré una solución. Antes de ingresar a ls y salir, primero necesitaba especificar el tipo de terminal. Agregar

tn.write("vt100\n") 

antes del "ls" me solucionó el problema.

+0

Se le recomienda que se otorgue la respuesta, ya que eso ayudará a otros que respondan a esta pregunta en el futuro. – Mawg

2

No tengo un servidor de telnet para probar, pero creo que el problema es que no está leyendo las respuestas del servidor hasta el aviso, después de cada comando que escribe.

PROMPT = ':~$' 
tn = telnetlib.Telnet(HOST) 
tn.read_until('login: ') 
tn.write(user + '\n') 
if password: 
    tn.read_until('Password: ') 
    tn.write(password + '\n') 
tn.read_until(PROMPT) 
tn.write('ls\n') 
print tn.read_until(PROMPT) 
tn.write('exit\n') 

btw, telnetnetlib puede ser complicado y las cosas varían dependiendo de su servidor FTP y la configuración del entorno. Es posible que sea mejor buscar algo como pexpect para automatizar el inicio de sesión y la interacción del usuario a través de telnet.

+0

¿Puede explicar por qué necesitamos dar la última vez aquí tn.write ('exit \ n') ?? – qre0ct

6

Si se está utilizando Windows, asegúrese de agregar un retorno de carro (\r) antes de que el carácter de nueva línea:

tn.write(user.encode('ascii') + "\r\n".encode('ascii')) 
0

Luché durante un tiempo tratando de escribir en una regleta de enchufes SynAccess. Así es como lo hice:

import sys 
import telnetlib 
HOST = < your SynAccess switch ip address > 
user = < user name > 
password = <password> 

tn = telnetlib.Telnet(HOST, 23, 5) 
tn.write("login\r\n") 
tn.write(user + "\r\n") 
tn.write(password + "\r\n") 
tn.write("rb 3\r\n") # this reboots plug 3 
tn.write("rb 1\r\n") # this reboots plug 1 
tn.write("logout\r\n") 
tn.close 
1

Sé que es tarde para publicar pero puede ayudar a otros. También tuve problemas para hacerlo bien, pero aquí está mi código. Mi telnet seguiría cierto flujo como si pidiera loginID y luego Password y luego tiene que esperar que se muestre una cadena en particular aquí, que para mi caso era "DB>", entonces puede continuar con el comando y todo. Mi salida se guarda en "out" varible

import os,re,telnetlib 
host = "10.xxx.xxx.xxx" 
port = 23 

telnet = telnetlib.Telnet() 
telnet.open(host, port) 
telnet.write('loginID\r\n') 
telnet.write('Password\r\n') 
out = telnet.read_until("DB>", 5) 
telnet.write('show cable modem reg\r\n') #Mycommand 
out = telnet.read_until("DB>", 5) 
telnet.write('quit\r\n') 
telnet.close() 

Para más variaciones y ayuda, consulte la página web nullege

0

uso de Python 2.7 o utilizar una versión superior con "(", ")" en la última línea