这个问题可能很简单,但到目前为止我还没有找到任何解决方案。基本上,以下代码应该连接到主机,接受命令,并打印主机返回的所有内容。
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
我已经尝试了其他解决方案,基于我查找的类似问题,但似乎没有一个在这里特别有用,我总是得到同样的错误。
答案 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服务器的配置,但是,默认情况下,它们需要身份验证,因此在输入命令之前您必须输入凭据。