Python 中的 Telnet 和编码

Telnet and Encoding in Python

这个问题可能很简单,但到目前为止我还没有在任何地方找到解决方案。基本上,以下代码应该连接到主机,执行命令,并打印主机 returns.

的所有内容
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

我已经根据我查找的类似问题尝试了其他解决方案,但 none 似乎特别适用于此,我总是得到同样的错误。

我假设您使用的是 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. 编码函数return是字符串的编码版本,它不会改变字符串本身,所以如果你想改变命令变量,你应该使用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 的 return 值返回到 command 变量中,因此它保持不变。因此,当您用 command 调用 write 时,它仍然收到一个字符串,这是它没有预料到的。 2 旁注——你需要使用 "\r\n",而不仅仅是 "\n",假设你使用的是 Windows telnet 服务器,尽管 "\n" 对 UNIX 系统没问题;我不知道您的 telnet 服务器的配置,但默认情况下,它们需要身份验证,因此您可能必须在输入命令之前输入凭据。