使用Python3调用系统的uinput来模拟键盘输入密码/PIN

首先需要先开启开发者模式,这个每个型号可能不太一样,自己找教程

解除 rootfs 只读限制(如果还没做)

sudo /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification
sudo reboot

这个据说可以跳过跳过开发者模式30秒等待界面(我的机器到我手上已经是只有3秒了)

sudo crossystem dev_default_boot=disk

将这两个文件放到指定路径:
文件 /usr/local/bin/autologin_type.py

#!/usr/bin/env python3
"""通过 /dev/uinput 模拟键盘输入,用于 ChromeOS 自动登录"""
import struct, time, sys, fcntl, os

UI_SET_EVBIT = 0x40045564
UI_SET_KEYBIT = 0x40045565
UI_DEV_CREATE = 0x5501
UI_DEV_DESTROY = 0x5502
EV_SYN = 0x00
EV_KEY = 0x01
SYN_REPORT = 0x00
KEY_ENTER = 28
KEY_LEFTSHIFT = 42

KEYMAP = {
    'a': (30, False), 'b': (48, False), 'c': (46, False), 'd': (32, False),
    'e': (18, False), 'f': (33, False), 'g': (34, False), 'h': (35, False),
    'i': (23, False), 'j': (36, False), 'k': (37, False), 'l': (38, False),
    'm': (50, False), 'n': (49, False), 'o': (24, False), 'p': (25, False),
    'q': (16, False), 'r': (19, False), 's': (31, False), 't': (20, False),
    'u': (22, False), 'v': (47, False), 'w': (17, False), 'x': (45, False),
    'y': (21, False), 'z': (44, False),
    '1': (2, False), '2': (3, False), '3': (4, False), '4': (5, False),
    '5': (6, False), '6': (7, False), '7': (8, False), '8': (9, False),
    '9': (10, False), '0': (11, False),
}

def write_event(fd, ev_type, code, value):
    t = time.time()
    sec = int(t)
    usec = int((t - sec) * 1000000)
    fd.write(struct.pack('llHHi', sec, usec, ev_type, code, value))
    fd.flush()

def setup_uinput():
    fd = open('/dev/uinput', 'wb')
    fcntl.ioctl(fd, UI_SET_EVBIT, EV_KEY)
    all_keys = set(kc for kc, _ in KEYMAP.values())
    all_keys.add(KEY_ENTER)
    all_keys.add(KEY_LEFTSHIFT)
    for key in all_keys:
        fcntl.ioctl(fd, UI_SET_KEYBIT, key)
    name = b'autologin-kbd' + b'\0' * 67
    fd.write(name)
    fd.write(struct.pack('HHHHi', 0x03, 0x01, 0x01, 1, 0))
    fd.write(b'\0' * (4 * 64 * 4))
    fd.flush()
    fcntl.ioctl(fd, UI_DEV_CREATE)
    time.sleep(0.5)
    return fd

def press_key(fd, keycode):
    write_event(fd, EV_KEY, keycode, 1)
    write_event(fd, EV_SYN, SYN_REPORT, 0)
    time.sleep(0.05)
    write_event(fd, EV_KEY, keycode, 0)
    write_event(fd, EV_SYN, SYN_REPORT, 0)
    time.sleep(0.05)

def type_char(fd, ch):
    if ch in KEYMAP:
        keycode, shift = KEYMAP[ch]
        if shift:
            write_event(fd, EV_KEY, KEY_LEFTSHIFT, 1)
            write_event(fd, EV_SYN, SYN_REPORT, 0)
        press_key(fd, keycode)
        if shift:
            write_event(fd, EV_KEY, KEY_LEFTSHIFT, 0)
            write_event(fd, EV_SYN, SYN_REPORT, 0)

def main():
    text = sys.argv[1] if len(sys.argv) > 1 else ''
    fd = setup_uinput()
    time.sleep(0.3)
    for ch in text:
        type_char(fd, ch)
        time.sleep(0.03)
    time.sleep(0.1)
    press_key(fd, KEY_ENTER)
    time.sleep(0.5)
    fcntl.ioctl(fd, UI_DEV_DESTROY)
    fd.close()

if __name__ == '__main__':
    main()

文件 /etc/init/autologin.conf

description "Auto login"
start on started ui

env LD_LIBRARY_PATH=/usr/local/lib

script
  sleep 15
  exec python3 /usr/local/bin/autologin_type.py 密码或pin看你要输入什么能解锁就输什么 > /tmp/autologin.log 2>&1
end script

你可以用各种方式保存在某个路径,然后再去终端里 sudo cp 当前文件路径 目标路径 把他复制过去

如果没有成功,可以手动运行 initctl start autologin 然后等15秒看log /tmp/autologin.log