.png)
Utilizo telnetlib (Python) para crear un cliente telnet (puerto 23) para comunicarme con un servidor AS/400. comunicacion con el comando telnet eso no es problema, pero con telnetlib no me sale ningun mensaje.
Aquí está mi código:
import getpass
import sys
import telnetlib
HOST = raw_input("HOST : ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()
try:
tn = telnetlib.Telnet(HOST)
tn.read_until("User..... ")
tn.write(user + "\r")
tn.read_until("Password..... ")
tn.write(password + "\r")
print tn.read_all()
except:
print "Error"
Gracias.
Respuesta1
IBM se ha acostumbrado a cambiar de nombre. Lo más probable es que la máquina de la que está hablando no sea realmente un AS/400, que ejecuta OS/400. IBM no ha enviado uno desde 2000. La línea de productos fue reemplazada (o renombrada, según su punto de vista) por los sistemas iSeries, que luego se convirtieron en System i, luego i5, pero el sistema operativo seguía siendo OS/400. La línea de productos de hardware se fusionó con los sistemas pSeries y se convirtió en Power Systems. El sistema operativo se convirtió en i5/OS y ahora, con la última versión 7.1, es oficialmente "IBM i". La próxima generación de hardware, Pure Systems, también puede ejecutar IBM i OS. Por lo tanto, es probable que su servidor sea en realidad un System i o un Power System, pero el personal de TI a menudo continúa llamándolos AS/400, incluso pensando en ellos como AS/400. Como grupo, este árbol genealógico de líneas de productos a menudo se denomina sistemas de gama media de IBM.
Los sistemas de gama media de IBM empleaban originalmente terminales IBM modelo 5250. Los modelos sucesivos todavía utilizaban lo que se conoce como protocolo 5250, que en algunos aspectos es similar al protocolo 3270 utilizado con los mainframes de IBM. Es un protocolo orientado a bloques, que generalmente transmite una pantalla completa a la vez y, a menudo, se denomina coloquialmente "pantalla verde" según el color original de los caracteres. Si bien es posible que su servidor esté configurado para usar VTxxx telnet, probablemente sea una posibilidad remota. Pero la compatibilidad con TN5250 es casi segura. Intenta conectarte con eso en su lugar.
Respuesta2
No se puede tratar la conexión AS/400 como lo haría con una conexión telnet *nix. En lugar de usar read_until(), intente usar read_very_eager() para obtener la pantalla completa (incluidas las secuencias de escape ANSI que colocan el cursor al principio del campo "Usuario..."), luego escriba() exactamente lo que escribiría si tuviera que iniciar sesión manualmente. También descubrí que para que aparezca la pantalla de inicio de sesión después de conectarse, primero debe escribir un carácter de nueva línea. No tengo idea de por qué es así, pero eso es lo que funcionó para mí.
import getpass
import sys
import telnetlib
HOST = raw_input("HOST : ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()
try:
tn = telnetlib.Telnet(HOST)
tn.write('\n')
tn.read_very_eager()
tn.write(user)
tn.write('\t') # tab into the next field
tn.write(password)
tn.write('\r') # 'enter' key
except:
print "Error"
Una última cosa: tenga en cuenta que el AS/400 no enviará un carácter EOF al final de la pantalla, por lo que read_all() simplemente se bloqueará y nunca regresará. Podrías intentar usar read_until(), pero dado que los datos devueltos por el servidor pueden estar divididos y llenos de secuencias de escape ANSI, no hay garantía de encontrar lo que buscas. La solución obvia parece poner read_very_eager() en un bucle while que termina cuando read_very_eager() devuelve una cadena vacía. Sin embargo, esto tiene sus propios problemas, ya que el servidor puede devolver varios mensajes de estado u otras pantallas parciales antes de pasar a la siguiente pantalla completa. Es probable que la única solución completa analice continuamente los datos devueltos por el servidor y realice un seguimiento de cómo se ve la pantalla actual (es decir, emulación de terminal y raspado de pantalla) o simplemente agregue algunos comandos time.sleep() entre la escritura y la lectura.
Respuesta3
A continuación se muestran las preguntas que iba a hacer en un comentario adjunto a su pregunta. Entonces me di cuenta de que tupublicado en cruzla pregunta a Stack Overflow. Por favor, no cruces publicaciones.
Allí encontré que habías publicado unpapelera de pastaen un comentario. Eso me llevó a cambiar mi comentario por una respuesta.
En su papelera de pegado, los mensajes del AS/400 muestran espacios entre los puntos. En el código de tu pregunta, no hay espacios entre los puntos. Es probable que poner espacios allí haga que su código funcione.
Para la posteridad (proporcionar este tipo de información por adelantado hará que sea más probable que reciba una buena respuesta y antes):
¿Está seguro de que está enviando los finales de línea correctos al AS/400?
¿Qué sistema operativo ejecuta el AS/400?
¿Las indicaciones de inicio de sesión por telnet del AS/400 realmente tienen todos esos puntos seguidos de un espacio?
¿Esperas ver un banner de bienvenida o similar?
¿Qué sucede si envía un comando antes del read_all
?
¿Qué dicen los registros del AS/400?
Respuesta4
Pruebe el módulo Python Expect ( pexpect
). Siga elpassmass.pyguión como ejemplo. También debería incluirse con el módulo pexpect.
Aquí hay unno probadorevisión de su guión:
import getpass
import pexpect
import sys
HOST = raw_input("HOST : ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()
try:
tn = pexpect.spawn('telnet %s'%(HOST))
tn.logfile = file ("LOG.TXT","wb")
i = tn.expect([pexpect.TIMEOUT, '[Uu]ser..... '])
if i == 0: # Timeout
print 'ERROR!'
print 'telnet could not login. Here is what telnet said:'
print tn.before, tn.after
sys.exit (1)
tn.sendline(user)
tn.expect (['[Pp]assword..... '])
tn.sendline(password)
except:
print "Error"