linux:检测外部键盘是否插入笔记本电脑

linux:检测外部键盘是否插入笔记本电脑

我有一台运行 Ubuntu Virtualbox 的 OSX 笔记本电脑,我可以使用笔记本电脑键盘或在办公室时插入的外部 USB 键盘与其进行交互。

是否有一个脚本可以运行来检测外部键盘是否已插入,以便 Ubuntu Virtualbox 中的键盘映射相应更改?

我目前手动运行“mac”或“key”来执行此命令:

setxkbmap -layout gb

或者

xmodmap .Xmodmap

我想在插入或拔出键盘时自动执行相同的操作。有任何想法吗?

答案1

您可以udev为此使用 -rule。在我的示例中,我为无线鼠标使用 USB 适配器,您必须进行相应调整:

1. 获取标识符

为了给设备制定一个独特的规则,我们需要正确地识别它。为此,请使用 的输出udevadm(您的 USB 键盘应显示为/dev/usb/<device>。将其插入并拔出以查看该设备是否出现(消失))。供应商和设备 ID 应足够唯一,但匹配越多越好。

udeadm info -a -n /dev/usb/hiddev0 | grep 'idVendor\|idProduct'
ATTRS{idVendor}=="0e8f"
ATTRS{idProduct}=="00a4"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0001"

记下与 ID 处的输出匹配的两个值lsusb(要知道这是哪个设备,可以测试有键盘和没有键盘的区别lsubs,或者看看是否可以匹配输出中的名称)

lsusb
Bus 005 Device 004: ID 0e8f:00a4 GreenAsia Inc.

因此,我们将分别使用0e8f00a4作为供应商和产品 ID。

2. 创建规则

规则本身只是列出了要做什么。将其保存为/etc/udev/rules.d/例如keyboard.rules(请注意,.rules后缀是必需的)。该文件将匹配 ( ==) 一些属性、操作,并运行我们的脚本:

ACTION=="add", ATTRS{idVendor}=="0e8f", ATTRS{idProduct}=="00a4", RUN+="/full/path/to/script.sh"

您可能会遇到该ACTION=="remove"部分的问题,请阅读。问题是某些属性在删除时被删除,因此udev无法再与您的删除规则匹配。

就我而言,我使用udeadm monitor --environemnt并拔掉了设备的插头。我选择了

ID_MODEL_ID=00a4

并将其用作唯一的要求(您可能需要在这里进行一些试验和错误以获得良好的匹配,但是对于仅更改键盘映射的情况来说,单个匹配是相当不错的)。请注意,删除规则需要ENV而不是ATTRS(AFAIKENV也适用于插件规则,但ATTRS删除失败)

ACTION=="remove", ENV{ID_MODEL_ID}=="00a4", RUN+="/path/to/removal_script.sh"

添加和删​​除规则可以是一个文件,每个操作一行。

3. 脚本

该脚本将始终由 运行root,因此请确保 a)root只能由(出于安全原因)写入 b) 如果您的命令需要由用户执行,请sudo -u user1 command在脚本中使用。当然它应该是可执行的。如果您尝试直接执行命令(即不使用脚本),请使用所述命令的绝对路径。

祝你好运。

相关内容