如何让 Linux 忽略键盘同时让我的程序可以读取它?

How to make Linux ignore a keyboard while keeping it available for my program to read?

我正在构建某种信息亭系统,为此我买了这个 USB DIY 键盘:https://www.amazon.com/gp/product/B07QPXQQ7L

这让我有很多按钮,它们的行为就像键盘键。

我正在编写一个程序 (Perl),它将从该键盘获取输入并根据该输入执行操作。

问题是我需要让系统的其余部分(包括 X 和 TTY)忽略该键盘,这样它就不会在终端或 window 管理器中键入随机内容。换句话说,系统应该忽略它,但设备本身必须在 /dev/input/...

中仍然可用

我不需要真正的键盘来控制机器,因为我通过 VNC 和 SSH 连接。

如果您知道如何从 /dev/input/... 键盘读取并最终像在终端中使用 STDIN 一样键入字母,则可加分。

谢谢!

我在这里找到了解决方案,在条形码的情况下,有人想要完全相同的东西 reader: https://serverfault.com/questions/385260/bind-usb-keyboard-exclusively-to-specific-application/976557#976557

SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
ACTION=="add", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="diykeyboard"

然后用 lsusb 中的供应商和产品 ID 替换 xxxxyyyy。所以在我的例子中 1c4f0002:

Bus 001 Device 003: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory

udevadm control --reload 对我没用,我不得不重新启动。

那么理论上键盘上输入的数据应该在 /dev/diykeyboard(SYMLINK 变量)处可用。

不幸的是,在我的例子中,有多个事件与该供应商+产品相匹配,为了匹配正确的事件,我需要在创建 SYMLINK 的第二行中添加 DEVPATH=="*:1.0/*", KERNEL=="event*"。然后令人惊讶的是它没有在 /dev 中创建 link 所以我不得不做一些肮脏的事情,用 ln:

自己创建一个 link
SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="1c4f", ATTRS{idProduct}=="0002", RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="1c4f", ATTRS{idProduct}=="0002", DEVPATH=="*:1.0/*", KERNEL=="event*", RUN+="/bin/sh -c 'ln -sf /dev/input/$kernel /diykeyboard'"

(不要在 /tmp 中创建 link,因为 udev 发生在启动时安装 /tmp 之前)

从那里我可以从 /diykeyboard(通常指向 /dev/input/event0)读取,或者使用显示键入的键的 evtest,或者直接使用我的程序然后解码扫描码.