连接 USB 鼠标时自动禁用触摸板的 Udev 规则

nik*_*tiu 3 udev

我很新,udev想写一个规则,在连接 USB 鼠标时禁用我的触摸板。

这是我想出的(主要是耳朵):

ACTION=="add", SUBSYSTEM=="input", ENV{ID_MODEL}=="USB_Mouse", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/nikitautiu/.Xauthority", ENV{REMOVE_CMD}="/usr/bin/synclient TouchpadOff=0", RUN+="/usr/bin/synclient TouchpadOff=1"
Run Code Online (Sandbox Code Playgroud)

尽管如此,它不会触发预期的效果。尽管连接我的 USB 鼠标时规则不会触发,但该命令似乎没问题。

use*_*332 5

我不明白你的规则为什么这么复杂?尤其是这一段

ENV{ID_MODEL}=="USB_Mouse",\
ENV{DISPLAY}=":0",\
ENV{XAUTHORITY}="/home/nikitautiu/.Xauthority",\   
ENV{REMOVE_CMD}="/usr/bin/synclient TouchpadOff=0"
Run Code Online (Sandbox Code Playgroud)

在第一行中,您匹配ID_MODEL只能由udevagainst看到的环境变量USB_Mouse。在以下三行中,您将值分配给环境变量。如果应用了规则,则再次仅被udev执行的命令看到synclient

我很确定这条规则永远不会被应用(您可以通过解析udev的日志文件来检查这一点。)因为除非您之前在环境中设置,否则很可能没有ID_MODEL内容USB_Mouse可访问的变量。ID_MODELudev

我建议你匹配你鼠标的Action、vendor-ID和product-ID,这在大多数情况下就足够了。然后你的规则看起来像

ACTION=="add", ATTRS{idVendor}=="<idVendor>", ATTRS{idProduct}=="<idProduct>", RUN+="/usr/bin/synclient TouchpadOff=1"
Run Code Online (Sandbox Code Playgroud)

您可以通过解析输出来获取<idVendor><idProduct>

lsusb -v
Run Code Online (Sandbox Code Playgroud)

我不记得在经典形式中是否允许给定的十六进制值0xffff。我总是只接受0x我规则中落后的部分。

  • 更通用的方法是匹配`ACTION=="add", ATTRS{bInterfaceProtocol}=="02", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceSubClass}=="01"`。这些是 USB 鼠标的特定特性。有关更多信息,请参阅 `lsusb -v` 和 http://www.usb.org/developers/defined_class。 (3认同)