在Python shell中运行telnet时出现错误信息
下面是我的代码的一个简单示例,如果你运行它,应该能重现我遇到的问题。有一点我发现,如果我的树莓派(我用来连接的设备)关掉或者网络线拔掉,错误就不会出现。
#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())