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 服务器的配置,但默认情况下,它们需要身份验证,因此您可能必须在输入命令之前输入凭据。
这个问题可能很简单,但到目前为止我还没有在任何地方找到解决方案。基本上,以下代码应该连接到主机,执行命令,并打印主机 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 服务器的配置,但默认情况下,它们需要身份验证,因此您可能必须在输入命令之前输入凭据。