usbguard基于linux内核暴露的usb设备属性(如idvendor、idproduct、serial等)工作,不识别windows式硬件id;需用usbguard list-devices获取真实字段构造规则,且规则生效需重插设备或重启服务。

USBGuard 本身不识别硬件 ID,只认 USB 设备描述符字段
USBGuard 没有“硬件 ID”(如 Windows 的 USB\VID_046D&PID_C52B)这个概念。它基于 Linux 内核暴露的 USB 设备属性工作,核心字段是:idVendor、idProduct、serial、busnum、devnum。你必须用这些字段写规则,不能直接粘贴 Windows 硬件 ID。
常见误区:把设备管理器里复制的 USB\VID_XXXX&PID_YYYY 直接喂给 usbguard add-rule —— 这会报错或规则不生效,因为 USBGuard 解析不了这种格式。
正确做法是先用 usbguard list-devices 查出目标键盘的真实字段值,再构造规则。注意:同一型号不同个体的 serial 通常不同,若要批量放行,得依赖 idVendor 和 idProduct 组合,并显式忽略 serial。
怎么获取物理键盘的 idVendor/idProduct/serial
插上目标键盘后执行:
sudo usbguard list-devices
输出类似:
12:12: allow id 0x046d:0xc52b serial "123456789" name "Logitech USB Keyboard" parent-hash 0x...
其中 0x046d:0xc52b 就是 idVendor:idProduct,serial "123456789" 是序列号(如有)。若 serial 显示为 "" 或 -,说明该设备未提供序列号,规则中就不能匹配 serial 字段。
关键操作建议:
- 确保键盘已插入且被系统识别(
lsusb能看到) - 如果
usbguard list-devices不显示,检查usbguard服务是否运行:sudo systemctl status usbguard - 多个同型号键盘想统一放行?去掉
serial条件,只保留idVendor和idProduct
写一条只放行某款物理键盘的规则
假设查到键盘是 Logitech 键盘,idVendor=0x046d,idProduct=0xc52b,无有效序列号。执行:
sudo usbguard add-rule "allow id 0x046d:0xc52b"
这条规则含义是:允许所有 vid=0x046d 且 pid=0xc52b 的 USB 设备(不限端口、不限序列号)。如果你只想放行带特定序列号的那一个,加 serial:
sudo usbguard add-rule "allow id 0x046d:0xc52b serial \"123456789\""
注意:serial 值要用反斜杠转义双引号,否则 shell 会截断。
其他常见组合:
- 只按厂商放行(宽泛):
allow id 0x046d:* - 排除某台问题键盘(黑名单):
block id 0x046d:0xc52b serial "BADSERIAL" - 规则优先级靠位置:越靠前的规则越先匹配,
append-rule加在末尾,insert-rule可指定位置
为什么加了规则键盘还是被拦?检查这三点
最常卡在这几个环节:
-
usbguard默认策略是deny,但必须确保没有更靠前的block规则覆盖了你的allow—— 用sudo usbguard list-rules看顺序 - 规则生效需设备重插:拔掉键盘再插回,或执行
sudo usbguard generate-policy(慎用,会清空现有规则并重生成) - USBGuard 不管 HID 层逻辑:它只控制 USB 总线级连接。如果键盘已连上但系统没加载
usbhid驱动,或被input层规则(如 udev)拦截,USBGuard 无能为力
复杂点在于:USBGuard 管的是“设备能不能通电”,而键盘能否被应用读取,还取决于内核驱动链和用户态输入栈。单靠它无法解决“键盘能亮灯但打不出字”的问题——那大概率是 evdev 权限、X11/Wayland 输入设备路由或 libinput 配置的问题。











