Ubuntu keyboard detection from bash script

For a USB device you can use lsusb and search for a Human Interface Device (interface class 3) with keyboard protocol (interface protocol 1), e.g.

$ 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 ...

Also, you can let udev help you. List the devices under /dev/input/by-path/ and the keyboard devices end in -kdb (at least in Ubuntu, where udev rules specify it), e.g.

$ 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

For USB Keyboards, I usually find the keyboard device by simply searching through "lsusb -v" output for the word "Keyboard":

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

Example output:

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

A more generic method is to search /sys/bus for any device which is both bInterfaceClass 03 and bInterfaceProtocol 01. Since you have to detect non-USB devices, and you want to use the output in a script, this method will probably work better for you:

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

Example output:

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

Caveat: I can't find a PS/2 keyboard to test this script. Since this thread is over seven years old now, I'm guessing that the author of the original question has long since moved on and doesn't need PS/2 detection anymore. I'll leave this answer anyway in the hope that someone else might find it useful, but be advised that I haven't tested this with non-USB devices.


One way would be to do this:

dmesg | grep keyboard

You might also be able to use Upstart and udev to detect and act on the presence of a keyboard.