这个问题可能很简单,但到目前为止我还没有在任何地方找到解决方案。基本上,以下代码应该连接到主机、接收命令并打印主机返回的所有内容。
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
我已经根据我查找的类似问题尝试了其他解决方案,但它们似乎都不适用于此处,我总是会遇到同样的错误。
最佳答案
我假设您使用的是 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
。
EDIT 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
变量,因此它保持不变。因此,当您使用 command
调用 write
时,它仍然收到一个字符串,这不是它所期望的。
2 个旁注 - 你需要使用 "\r\n"
,而不仅仅是 "\n"
,假设你使用的是 Windows telnet 服务器,尽管 "\n"
适用于 UNIX 系统;我不知道您的 telnet 服务器的配置,但默认情况下,它们需要身份验证,因此您可能必须在输入命令之前输入凭据。
关于python - Python 中的 Telnet 和编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31572002/