Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Excuse my ignorance of linux OS/hardware issues...I'm just a programmer :)

I have an application that calls out to some bash scripts to launch external applications, in this case Firefox. The application runs on a kiosk with touch screen capability. When launching Firefox, I also launch a virtual keyboard application that allows the user to have keyboard input.

However, the kiosk also has both PS/2 and USB slots that would allow a user to plug in a keyboard. If a keyboard were plugged in, it would be nice if I didn't have to launch the virtual keyboard and provide more screen space for the Firefox window.

Is there a way for me to detect if a keyboard is plugged in from the bash script? Would it show up in /dev, and if so, would it show up at a consistent location? Would it make a difference if the user used a PS/2 or USB keyboard?


share|improve this question
up vote 1 down vote accepted

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
share|improve this answer
Thanks Dan! The second method seems like it would work for me. – Ryan Brubaker Mar 26 '10 at 13:45

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.

share|improve this answer

For USB, you can search /sys/bus/usb/devices for a device with a configuration with an interface with class HID (0x03) and protocol Keyboard (0x01).

Bash script:

for dev in /sys/bus/usb/devices/*-*:*
  if [ -f $dev/bInterfaceClass ]
    if [[ "$(cat $dev/bInterfaceClass)" == "03" && "$(cat $dev/bInterfaceProtocol)" == "01" ]]
      echo "Keyboard detected: $dev"
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.