题 从bash脚本检测Ubuntu键盘


请原谅我对Linux OS /硬件问题的无知......我只是一个程序员:)

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

但是,自助服务终端还具有PS / 2和USB插槽,允许用户插入键盘。如果插入了键盘,如果我不必启动虚拟键盘并为Firefox窗口提供更多屏幕空间,那就太好了。

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

谢谢!


5
2018-03-25 16:02






答案:


对于您可以使用的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
2018-03-25 17:09



谢谢丹!第二种方法似乎对我有用。 - Ryan Brubaker


对于USB键盘,我通常只需在“lsusb -v”输出中搜索单词“Keyboard”即可找到键盘设备:

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设备测试过。


2
2018-06-08 16:44



我有PS / 2键盘 - bugs.launchpad.net/ubuntu/+source/udev/+bug/838760  - 两个命令都没有检测到它。 - anatoly techtonik


一种方法是这样做:

dmesg | grep keyboard

您也可以使用 暴发户 和 的udev 检测并操作键盘的存在。


1
2018-03-25 16:10





对于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

0
2018-03-25 17:30





PS / 2键盘列在其中 /sys/class/input 设备。 USB键盘也可能存在,因为下面的鼠标是USB一个:

$ grep "" /sys/class/input/*/name
/sys/class/input/input0/name:Power Button
/sys/class/input/input1/name:Power Button
/sys/class/input/input2/name:AT Translated Set 2 keyboard
/sys/class/input/input3/name:Microsoft Comfort Mouse 6000

$ grep keyboard /sys/class/input/*/name
/sys/class/input/input2/name

另一个发现是键盘目录包含状态键的子目录:

$ ls -d /sys/class/input/*/*::capslock
/sys/class/input/input2/input2::capslock

0
2018-01-07 12:20