Py telnetlib OKI 2.7,但3.6以下的错误

时间:2018-03-09 16:51:39

标签: python anaconda telnetlib

我的情况类似于通过python' telnetlib'连接Google.com。

使用python Anaconda 2.7.10 shell我有一个很好的打击脚本:

right

回馈:

HOST ="www.google.com"
tn=telnetlib.Telnet(HOST,"80")
tn.write("GET /index.html HTTP/1.1\nHost:"+HOST+"\n\n")
l=tn.read_all()
print(l)

如果我现在转到Python Anaconda 3.6.3上面的相同脚本我有以下错误:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.it/index.html?
gfe_rd=cr&dcr=0&ei=A7KiWv_2G6fCXojstrAO
Content-Length: 276
Date: Fri, 09 Mar 2018 16:10:43 GMTenter code here

你对此有什么建议吗?我红了一些关于telnetlib的文档,但到目前为止还没有找到解决方案:-(。有什么想法,我可能会尝试做什么?

非常感谢你!法比奥。

2 个答案:

答案 0 :(得分:2)

问题最终归结为Python 2和Python 3中字符串的定义方式不同。如果您从未读过这些内容,可以在线查找一些材料,例如thistelnetlib适用于bytes个对象(Telnet通常使用7位ASCII字符),Python 3中的字符串(str个对象)是没有特定编码的文本表示(直到你调用它们{ {3}}将它们转换为bytes的方法。当您使用常规字符串调用.encode()方法时,它会检查它是否包含telnetlib.IAC,即字节对象b'\xff'(255);由于两个对象(参数和telnetlib.IAC)具有不同的类型,因此失败。

显然,修复方法是一直只使用bytes个对象(比如字符串,但前缀为b):

HOST = b"www.google.com"
tn=telnetlib.Telnet(HOST, 80)
tn.write(b"GET /index.html HTTP/1.1\nHost:"+HOST+b"\n\n")
l=tn.read_all()
print(l)

好处是,您还可以在Python 2中使用b - 前缀字符串(来自Python 2.6),它们只是常规的Python 2字符串,因此代码适用于这两个版本。您还可以查看.write()之类的工具,以便更轻松地将代码移植到Python 3(更多关于主题2to3)。

答案 1 :(得分:1)

我猜测telnet需要以字节为单位而不是你拥有的unicode。

也许尝试编码?

tn.write(("GET /index.html HTTP/1.1\nHost:"+HOST+"\n\n").encode('ascii'))