如何禁用输入设备?

如何禁用输入设备?

我的笔记本电脑内置键盘坏了(Shift 按钮有时会卡住)。我专门使用外接键盘,但内置键盘会干扰它。 (我无法拔掉设备。)

我可以使用 禁用xinput,但它会再次启用(请参阅永久禁用键盘)。

我已识别出该设备。 (您需要安装lsinput例如apt install input-utils)。

sudo lsinput

/dev/input/event0
   bustype : BUS_I8042
   vendor  : 0x1
   product : 0x1
   version : 43841
   name    : "AT Translated Set 2 keyboard"
   phys    : "isa0060/serio0/input0"
   bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

我如何禁用它?

答案1

将其列入黑名单可能是一种选择。就像,如果正在通过该atkbd模块并且没有其他东西需要该特定模块,则只需将该模块列入黑名单即可。

否则,也许unbind也是一个选择。

由于缺乏笔记本电脑进行测试,我将一个备用鼠标连接到我的系统,然后将其禁用。

这是鼠标:

I: Bus=0003 Vendor=04f3 Product=0235 Version=0111
N: Name="OM"
P: Phys=usb-0000:00:14.0-10.1/input0
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10.1/2-10.1:1.0/0003:04F3:0235.0004/input/input12
U: Uniq=
H: Handlers=event12 mouse1 
B: PROP=0
B: EV=17
B: KEY=70000 0 0 0 0
B: REL=903
B: MSC=10

正在经历/sys/bus/hid/...

# head /sys/bus/hid/drivers/*/*/*/*/name
==> /sys/bus/hid/drivers/hid-generic/0003:046A:010D.0001/input/input3/name <==
HID 046a:010d

==> /sys/bus/hid/drivers/hid-generic/0003:046A:010D.0002/input/input4/name <==
HID 046a:010d

==> /sys/bus/hid/drivers/hid-generic/0003:046D:C077.0003/input/input5/name <==
Logitech USB Optical Mouse

==> /sys/bus/hid/drivers/hid-generic/0003:04F3:0235.0004/input/input12/name <==
OM

好吧,让我们把它踢出去吧。

# echo 0003:04F3:0235.0004 > /sys/bus/hid/drivers/hid-generic/unbind

它消失了。不再移动鼠标光标。甚至不再被列为输入设备。真的没了。

因此,您可以使用 ing 执行此类操作unbind,并且根据它使用的驱动程序,还可以将其列入黑名单。主要问题是找到正确的名称和位置来解除绑定,然后使用自定义 udev 规则进行自动化。否则,如果您拔下插头并将其重新插入,它会再次出现。

答案2

如果查看 USB 级别没有发现任何可以修复的内容,那么接下来您可以做的两件事是在输入层级别“抓住”它,或者阻止它在 X 级别上激活。

为了第一,

evtest --grab /dev/input/event0 > /dev/null

或者类似的东西应该可以解决问题:抓取确保只有抓取应用程序接收事件,即 X 不会接收任何事件。

对于第二个,将一个InputClass部分添加到您的xorg.conf,沿着以下行

Section "InputClass"
    Identifier "BrokenKeyboard"
    MatchDevicePath "/dev/input/by-path/platform-i8042-serio-0-event-kb"
    Option "Ignore" "true"
EndSection

假设该路径实际上是链接到您的键盘的路径。不要/dev/input/event0在这里使用 etc.,它不能保证跨引导的一致性。

答案3

迟来了,但我想为苹果用户稍微解释一下上面的答案。我有一个带有损坏内部键盘的 MBP,我一直使用evtest它来获取输入并将其发送到/dev/null.这似乎是最常见的建议。此解决方案的问题在于,如果更新内核,则事件编号会发生变化,并且如果您有一个像我一样在启动时运行的脚本,则必须在每次内核更新时手动更新该编号。这就是 using 的用武之地unbind,以及上面的答案如何激励我最终放弃evtest.我想出了一个简单的台词,它似乎完美地完成了这项工作。

这是完整的命令:

head /sys/bus/hid/drivers/*/*/*/*/name | grep "apple" | sed -E 's/[^0-9A-F:.]*//g' | awk '{ print substr( $0, 1, length($0)-2 ) }' > /sys/bus/hid/drivers/apple/unbind

我们知道第一部分的作用,所以我将解释sed和 的必要性awkhead与 a 一起运行grep将输出类似于以下内容的内容:

/sys/bus/hid/drivers/apple/0003:046D:C077.0003/input/input18/name

现在,我们用来sed删除所有不是十六进制字符的内容:

0003:046D:C077.000318

您会注意到输入数字也包含在末尾,这是我们不需要的,因此我们使用它awk来删除字符串的最后两个字符:

0003:046D:C077.0003

当然,我们有输出方向将此字符串发送到/sys/bus/hid/drivers/apple/unbind.将其放入可以在启动时运行的脚本中,然后就完成了!需要注意的是,它必须针对hid-generic设备进行修改。 Apple 有自己的输入驱动程序目录,这使这变得更简单,并且grep仅使用“apple”就足够了。

编辑:这就是众包信息的美妙之处。感谢下面的 Stephen Kitt 提供的这个解决方案。它比我的优雅得多,并且正确地考虑了输入设备编号。

for name in /sys/bus/hid/drivers/apple/*/*/*/name; do device=$(cut -d/ -f7 <<<"$name"); [ "$device" != "*" ] && printf "%s" "$device" > /sys/bus/hid/drivers/apple/unbind; done

相关内容