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.