telnet连接到一个AS400系统通过telnetlib(Python)

我使用telnetlib – Python – 创build一个telnet客户端 – 端口23 – 与AS / 400服务器通信。 与telnet命令的通信没有问题,但与telnetlib我没有得到任何消息。

这是我的代码:

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" 

谢谢。

IBM已经养成了改名字的习惯。 你所说的机器可能不是真正的OS / 400的AS / 400。 IBM自2000年以来一直没有发货。产品线被iSeries系统取代(或根据您的观点进行了重新命名),后来成为System i,然后是i5,但操作系统仍然是OS / 400。 硬件产品线与pSeries系统合并,并成为Power Systems。 操作系统成为i5 / OS,现在在最新的7.1版本下,它正式成为“IBM i”。 下一代硬件产品Pure Systems也可以运行IBM i OS。 所以很有可能你的服务器实际上是系统i或者电源系统,但是IT人员经常把他们称为AS / 400,甚至把他们当作AS / 400。 作为一个群体,这种产品线的家族树通常被称为IBM的中端系统。

IBM中端系统最初采用了IBM 5250型terminal。 连续的模型仍然使用被称为5250协议的协议,这在某些方面与IBM大型机使用的3270协议类似。 它是一个面向块的协议,通常一次传输整个屏幕,并且通常通俗地说是基于字符的原始颜色的“绿色屏幕”。 虽然您的服务器可能被configuration为使用VTxxx远程login,但这可能是一个长镜头。 但TN5250支持几乎可以肯定。 尝试连接,而不是。

你不能像处理* nix telnet连接一样处理AS / 400连接。 尝试使用read_very_eager()来获取整个屏幕(包括将游标定位在“User …”字段开头的ANSI转义序列),然后将()如果您要手动login。 我也发现为了让连接后login屏幕出现,你需要先写一个换行符。 我不知道这是为什么,但那是对我有用的。

 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" 

最后一件事:请记住,AS / 400将不会在屏幕末尾发送EOF字符,所以read_all()将会挂起而不会返回。 你可以尝试使用read_until(),但是由于从服务器返回的数据可能被分解并且充满了ANSI转义序列,所以不能保证find你想要的东西。 显而易见的解决scheme似乎把read_very_eager()放在while循环中,当read_very_eager()返回一个空string时。 但是,这有其自身的问题,因为服务器可能会返回各种状态消息或其他部分屏幕,然后再转到下一个全屏。 唯一完整的解决scheme可能会连续parsing服务器返回的数据,并跟踪当前屏幕的样子(即terminal仿真和屏幕抓取),或者简单地在写入和读取之间添加一些time.sleep()命令。

以下是我在问题附带的评论中要问的问题。 然后我注意到你跨问题的Stack Overflow。 请不要过帐。

在那里,我发现你已经在评论中发布了一个粘贴箱 。 这导致我把我的评论改变成一个答案。

在您的粘贴箱中,AS / 400的提示符会显示两个句点之间的空格。 在你的问题的代码中,点之间没有空格。 有可能在那里放置空格会导致你的代码工作。


对于后人来说(提供这种信息会使你很快得到一个很好的答案):

你确定你要发送正确的行结束符到AS / 400吗?

AS / 400运行什么操作系统?

AS / 400 telnetlogin提示是否真的具有所有这些空格?

你期待看到一个欢迎横幅或类似的?

如果在read_all之前发送命令,会发生什么?

AS / 400上的日志说什么?

试试Python Expect( pexpect )模块。 以passmass.py脚本为例。 它也应该包含在pexpect模块中。

以下是脚本的未经testing的修订:

 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"