通过 Bash 脚本检测 Ubuntu 键盘

通过 Bash 脚本检测 Ubuntu 键盘

请原谅我对 Linux 操作系统/硬件问题的无知...我只是一名程序员:)

我有一个应用程序,它调用一些 bash 脚本来启动外部应用程序,在本例中是 Firefox。该应用程序在具有触摸屏功能的信息亭上运行。启动 Firefox 时,我还会启动一个虚拟键盘应用程序,允许用户进行键盘输入。

不过,信息亭还配有 PS/2 和 USB 插槽,用户可以插入键盘。如果插入了键盘,我就不必启动虚拟键盘,为 Firefox 窗口提供更多屏幕空间,这样就太好了。

有没有办法让我从 bash 脚本中检测键盘是否插入?它会显示在 /dev 中吗?如果是,它会显示在一致的位置吗?如果用户使用 PS/2 或 USB 键盘,会有什么不同吗?

谢谢!

答案1

对于 USB 设备,您可以使用lsusb并搜索具有键盘协议(接口协议 1)的人机接口设备(接口类别 3),例如

$ lsusb -v
... loads of stuff deleted ...
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
... loads of stuff deleted ...

另外,你可以让udev帮助你。列出下面的设备/dev/input/by-path/,并以 结尾的键盘设备-kdb(至少在 Ubuntu 中,udev 规则指定了它),例如

$ ls -l /dev/input/by-path/*-kbd
lrwxrwxrwx 1 root root 9 2010-03-25 09:14 /dev/input/by-path/pci-0000:00:1a.2-usb-0:1:1.0-event-kbd -> ../event4

$ ls -l /dev/input/by-path/*-kbd
lrwxrwxrwx 1 root root 9 2009-08-29 09:46 /dev/input/by-path/platform-i8042-serio-0-event-kbd -> ../event1

答案2

一种方法是这样做:

dmesg | grep keyboard

您也可以使用暴发户udev检测键盘的存在并采取行动。

答案3

对于 USB 键盘,我通常通过在“lsusb -v”输出中搜索单词“键盘”来找到键盘设备:

lsusb -v 2>/dev/null | egrep '(^Bus|Keyboard)' | grep -B1 Keyboard

示例输出:

Bus 001 Device 004: ID 413c:2006 Dell Computer Corp. 
  bInterfaceProtocol      1 Keyboard

更通用的方法是搜索 /sys/bus 以查找任何同时为 bInterfaceClass 03 和 bInterfaceProtocol 01 的设备。由于您必须检测非 USB 设备,并且想要在脚本中使用输出,因此这种方法可能更适合您:

grep -l 03 /sys/bus/*/*/*/bInterfaceClass |
sed 's/Class$/Protocol/' |
xargs grep -l 01 |
xargs dirname

示例输出:

/sys/bus/usb/devices/1-4.1:1.0

警告:我找不到 PS/2 键盘来测试此脚本。由于此主题已有七年多历史,我猜原始问题的作者早已离开,不再需要 PS/2 检测。无论如何,我都会留下这个答案,希望其他人可能会觉得它有用,但请注意,我还没有使用非 USB 设备对此进行测试。

答案4

对于 USB,您可以在 /sys/bus/usb/devices 中搜索具有以下配置的设备:接口为类 HID(0x03)且协议为键盘(0x01)。

Bash 脚本:

#!/bin/bash
for dev in /sys/bus/usb/devices/*-*:*
do
  if [ -f $dev/bInterfaceClass ]
  then
    if [[ "$(cat $dev/bInterfaceClass)" == "03" && "$(cat $dev/bInterfaceProtocol)" == "01" ]]
    then
      echo "Keyboard detected: $dev"
    fi
  fi
done

相关内容