python - Python 中的 Telnet 和编码

标签 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

我已经根据我查找的类似问题尝试了其他解决方案,但它们似乎都不适用于此处,我总是会遇到同样的错误。

最佳答案

我假设您使用的是 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/

相关文章:

Python SMTP 服务器收不到邮件

python - python 格式说明符中的变量

node.js - 如何telnet到局域网中的一台电脑

imap - 我想从 IMAP INBOX 获取最后一条消息 UID

iphone - Telnet Iphone 开发

javascript - 使用 Telnet 的 Node.js 客户端和服务器游戏

python - 为什么文本文件行中的 '\x01\x1A'( header 开始和替代控制字符)会过早地停止 for 循环?

python - Django:子目录中的静态文件

python - 使用 subprocess.Popen 应用环境变量

linux - 动态修改数据流