Python中的Telnet和编码

时间:2015-07-22 19:11:46

标签: python telnet

这个问题可能很简单,但到目前为止我还没有找到任何解决方案。基本上,以下代码应该连接到主机,接受命令,并打印主机返回的所有内容。

import telnetlib
import time

HOST = input("IP Address: ")
tn = telnetlib.Telnet(HOST, port = 23, timeout = 20)
time.sleep(10)
command = input("Enter command: ")
command.encode('utf-8')
tn.write(b"\n".join(command))
ret1 = tn.read_eager()
print(ret1)

print("Success!")
tn.close()

然而,无论我尝试什么,我都会继续犯同样的错误:

C:\Python34>call python34 telnet_test.py
IP Address: 10.20.249.64
Enter command: 001 rq version
Traceback (most recent call last):
  File "telnet_test.py", line 9, in <module>
    tn.write(b"\n".join(command))
TypeError: sequence item 0: expected a bytes-like object, str found

我已经尝试了其他解决方案,基于我查找的类似问题,但似乎没有一个在这里特别有用,我总是得到同样的错误。

1 个答案:

答案 0 :(得分:0)

我假设您使用的是Python 2而不是3。 我没有任何编码的混乱,它的工作原理。基本上,我的代码如下:

HOST = input("IP Address: ")
tn = telnetlib.Telnet(HOST, port = 23, timeout = 20)
time.sleep(10)
command = input("Enter command: ")
tn.write(command + "\r\n")
ret1 = tn.read_eager()
print(ret1)

我会指出这三件事:  1. encode函数返回字符串的编码版本,它不会改变字符串本身,所以如果你想改变命令变量,你应该使用command = command.encode("utf-8")。  2.我使用\r\n,因为这是一台Windows机器。  3.此外,我不确定这是否是您的意图,但您的join在命令字符串中的每个字符之间插入\n

编辑24.07.15 由于您使用的是Python 3,我下载了Python 3并再次使用它。这是一个适合我的代码:

HOST = input("IP Address: ")
tn = telnetlib.Telnet(HOST, port = 23, timeout = 20)
time.sleep(10)
command = input("Enter command: ") + "\r\n"
tn.write(command.encode('utf-8'))
ret1 = tn.read_eager()
print(ret1)

您收到此错误的原因是因为您没有将encode的返回值重新收回command变量,因此保持不变。因此,当您使用write调用command时,它仍会收到一个字符串,这是它没有预料到的。 2附注 - 假设您使用的是Windows telnet服务器,则需要使用"\r\n",而不仅仅是"\n",尽管"\n"适用于UNIX系统;我不知道您的telnet服务器的配置,但是,默认情况下,它们需要身份验证,因此在输入命令之前您必须输入凭据。