首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过telnetlib (Python)连接到AS400系统

通过telnetlib (Python)连接到AS400系统
EN

Server Fault用户
提问于 2013-12-17 10:04:14
回答 4查看 5.3K关注 0票数 4

我使用telnetlib - Python -创建telnet客户端-端口23 -与AS/400服务器进行通信。使用telnet命令进行通信是没有问题的,但是使用telnetlib,我不会收到任何消息。

这是我的代码:

代码语言:javascript
复制
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"

谢谢。

EN

回答 4

Server Fault用户

回答已采纳

发布于 2013-12-20 06:12:12

IBM已经养成了改名的习惯。您所说的机器很可能不是真正的AS/400,它运行的是OS/400。IBM自2000年以来一直没有出过货。iSeries系统取代了产品线(或根据您的观点重新命名),后来变成了systems,然后变成了i5,但是OS仍然是OS/400。硬件生产线与pSeries系统合并,成为电力系统。这个操作系统变成了i5/ OS,现在在最新的7.1版下,它正式成为了"IBM“。下一代硬件,Pure,也可以运行IBM。所以你的服务器很可能实际上是一个系统I或一个电力系统,但是IT人员经常继续称他们为/400‘S,甚至认为他们是/400’S。作为一个群体,这个产品线家族树经常被称为IBM的中档系统。

IBM中档系统最初使用的是IBM型号5250终端。连续模型仍然使用所谓的5250协议,在某些方面类似于IBM大型机使用的3270协议。它是一种面向块的协议,通常一次传输整个屏幕,通常根据字符的原始颜色被俗称为“绿色屏幕”。虽然您的服务器可能被配置为使用VTxxx telnet,但这可能是一个长期目标。但是TN5250的支持几乎是肯定的。试着用它来连接。

票数 3
EN

Server Fault用户

发布于 2014-02-04 09:16:08

不能像对待*nix telnet连接那样对待AS/400连接。与其使用read_until(),不如使用read_very_eager()获取整个屏幕(包括将光标定位在“用户.”开头的ANSI转义序列)。字段),然后编写()--如果要手动登录的话--您将输入哪些内容。我还发现,为了让登录在屏幕上显示在连接之后,您需要首先编写一个换行符。我不知道这是为什么,但这才是对我有用的。

代码语言:javascript
复制
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转义序列,因此无法保证找到所需的内容。显而易见的解决方案似乎是在read_very_eager()返回空字符串时将read_very_eager()放入一个when循环终止。但是,这也有其自身的问题,因为服务器可能在进入下一个全屏之前返回各种状态消息或其他部分屏幕。唯一完整的解决方案可能是继续解析服务器返回的数据,并跟踪当前屏幕的外观(即终端模拟和屏幕抓取),或者在写入和读取之间添加一些time.sleep()命令。

票数 3
EN

Server Fault用户

发布于 2013-12-18 02:18:04

下面是我准备在你的问题的评论中提出的问题。然后,我注意到您交叉贴的问题堆栈溢出。请不要越过柱子。

在那里,我发现你在一条评论中发布了一个糊状桶。这导致我把我的评论变成了一个答案。

在粘贴框中,AS/400's提示显示句点之间的空格。在你问题的代码中,点之间没有空格。很可能,将空格放在那里会导致代码工作。

对于后人(提前提供这类信息将使你更有可能得到一个好的答案):

您确定要将正确的行尾发送到AS/400吗?

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

AS/400 telnet登录提示中是否真的有所有这些点后面有一个空格?

你希望看到一个欢迎的横幅还是类似的?

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

AS/400上的日志是怎么说的?

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/561872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档