在Python shell中运行telnet时出现错误信息

3 投票
1 回答
13119 浏览
提问于 2025-04-18 03:49

下面是我的代码的一个简单示例,如果你运行它,应该能重现我遇到的问题。有一点我发现,如果我的树莓派(我用来连接的设备)关掉或者网络线拔掉,错误就不会出现。

#IMPORTS
import time
import telnetlib
import sys
import getpass


#TELNET
user = input("Please Enter Your Username: ")
time.sleep(0.4)
pass_ = input("Please Enter Your Password: ")

bot = telnetlib.Telnet("192.168.1.128")
bot.read_until("login: ".encode(),  timeout=None)
bot.write(user + "\n")
bot.read_until("Password: ".encode(),  timeout=None)
bot.write(pass_ + "\n")
bot.write("cd PiBits/ServoBlaster")

我收到以下错误信息:

Traceback (most recent call last):
  File "/Users/kiancross/Desktop/PROJECTS/RASPBERRY_PI/ROBOT/CONTROLLER_GUI/RPi_BOT_CONTROLLER.py", line 17, in <module>
    bot.write(user + "\n")
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/telnetlib.py", line 289, in write
    if IAC in buffer:
TypeError: 'in <string>' requires string as left operand, not bytes

我运行了以下代码,你可以在这个帖子中看到,但正如你从答案中看到的,我把它改成了上面的代码,结果出现了上面的错误信息。

我得说,这段代码还远没有完成,很多东西只是为了测试,直到我能让telnet正常工作为止!

我尝试了这个帖子中提到的针对旧版本python的修复。

我用print(type(user))查看变量的类型,结果是字符串。我尝试了bot.write((user + "\n").encode(latin-1)),如这个修复所示,但错误信息仍然出现。我也尝试了用unicode编码。我明白那行代码的一部分编码错了,但我不知道是变量的问题还是"\n"的问题。我还尝试了bot.write(user + b"\n"),但这并没有消除错误。

如果有人有其他方法可以解决这个错误,我将非常感激。

谢谢

P.S 我在使用python 3.4.0

编辑

我尝试了这个:

bot = telnetlib.Telnet("192.168.1.128")
bot.write(user + "\n".encode('ascii'))
bot.read_until(b"Password: ")
bot.write((pass_ + "\n").encode('ascii'))

但我仍然得到相同的错误。

当我这样做时:

bot = telnetlib.Telnet("192.168.1.128")
bot.read_until(b"login: ")
bot.write(user + b"\n")
bot.read_until(b"Password: ")
bot.write(pass_ + b"\n")

我得到了一个不同的错误:

Traceback (most recent call last):
  File "/Users/kiancross/Desktop/PROJECTS/RASPBERRY_PI/ROBOT/CONTROLLER_GUI/RPi_BOT_CONTROLLER.py", line 23, in <module>
    bot.write(user + b"\n")
TypeError: Can't convert 'bytes' object to str implicitly

所有的错误似乎都在说需要是字符串,但我的变量已经是字符串了。

谢谢

1 个回答

11

这个telnet接口可能是想处理字节而不是Unicode字符。我在Python3上测试过这段代码,它可以避免出现错误:

import telnetlib
bot = telnetlib.Telnet("127.0.0.1", 22)
user = "dobbs"
bot.write((user + "\n").encode('ascii'))
print(bot.read_all())

撰写回答