通过串行通信自动执行登录操作



我正在尝试为通过serial与之通信的设备自动执行登录功能。为了达到login:提示符,我必须在设备启动时按回车键,然后在一段时间后出现login:提示符,一旦程序发现"login:"字符串,它就会输入用户名(或者至少这是计划(。输入正确的用户名后,将显示Password:提示符,如果我输入正确的密码,我成功登录设备,如果我输入错误的密码,我必须重新开始(这意味着再次输入用户名(。另外,如果我第一次尝试登录失败,login:提示更改为username:

到目前为止,我已经做到了,但是

import serial
import re
from time import sleep
import time
ser = serial.Serial('COM3', timeout=1)
ser.baudrate = 115200
def auto_login():
while True:
output = ser.read(10000).decode('utf-8', 'ignore')
testmode_command = ser.write("rn".encode())
print(output)
if "1 : press [Enter] for test mode / [Esc+Enter] for plain Linux" in output:
ser.write(testmode_command)
if " login:" in output:
break

def login_repeat():
login = b"root rn"
output = ser.read(10000).decode('utf-8', 'ignore')
print(output)
if " login:" in output:
ser.write(login)
if "Username:" in output:
ser.write(login)
def pass_word():
password = b"p rn"
time.sleep(0.1)
output = ser.read(10000).decode('utf-8', 'ignore')
print(output)
if "Password:" in output:
ser.write(password)

我得到的结果是:

Login incorrect
Username: 
root 
System starting up, please try later
Login incorrect
Username: 
root 

出于某种原因,我看起来输入首先发送rn命令而不是用户名,然后发送命令。知道如何解决这个问题吗?

在发送命令之前添加time.sleep(0.1),如下所示:

time.sleep(0.1)
ser.write(b"root")
time.sleep(0.1)
ser.write('r'.encode())

就像预感一样,你确定,你没有缓冲问题。我不知道串行模块,但库可能会将"Enter"与登录信息一起发送。 这将导致"输入"作为用户名。

快速搜索得出了这个答案:https://stackoverflow.com/a/12892221/4252584

您可以尝试显式刷新缓冲区。

另一方面,我想知道为什么您在串行行上没有事先"Enter"键的情况下进入登录提示。您确定,您需要在线上的"输入"键吗?

最新更新