文章
2026/2/27
ChromeOS自动登录
使用Python3调用系统的uinput来模拟键盘输入密码/PIN
首先需要先开启开发者模式,这个每个型号可能不太一样,自己找教程
解除 rootfs 只读限制(如果还没做)
sudo /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verificationsudo 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 = 0x40045564UI_SET_KEYBIT = 0x40045565UI_DEV_CREATE = 0x5501UI_DEV_DESTROY = 0x5502EV_SYN = 0x00EV_KEY = 0x01SYN_REPORT = 0x00KEY_ENTER = 28KEY_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'\�' * 67 fd.write(name) fd.write(struct.pack('HHHHi', 0x03, 0x01, 0x01, 1, 0)) fd.write(b'\�' * (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>&1end script你可以用各种方式保存在某个路径,然后再去终端里 sudo cp 当前文件路径 目标路径 把他复制过去
如果没有成功,可以手动运行 initctl start autologin 然后等15秒看log /tmp/autologin.log