Автоматизация действий входа через последовательную связь - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь автоматизировать функцию входа в систему для устройства, с которым я общаюсь через serial.Чтобы получить приглашение login:, я должен нажать клавишу enter во время загрузки устройства, а затем через некоторое время появится приглашение 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("\r\n".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 \r\n"
    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 \r\n"
    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 

По какой-то причине мне кажется, что ввод посылается сначала команда \r\n вместо имени пользователя, а затем команда.Есть идеи, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Добавьте time.sleep(0.1), прежде чем отправить команду, например:

time.sleep(0.1)
ser.write(b"root")
time.sleep(0.1)
ser.write('\r'.encode())
1 голос
/ 25 сентября 2019

Так же, как догадка, вы уверены, что у вас нет проблем с буферизацией.Я не знаю серийный модуль, но возможно, что библиотека отправит «Enter» вместе с информацией для входа.Это может привести к «Enter» в качестве имени пользователя.

При быстром поиске был получен ответ: https://stackoverflow.com/a/12892221/4252584

Вы можете попытаться явно очистить буферы.

НаС другой стороны, мне интересно, почему вы попадаете в приглашение для входа в систему без предварительного нажатия клавиши «Enter» в последовательной линии.Вы уверены, что вам нужна клавиша «Ввод» в строке?

...