Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

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?

Thanks!

share|improve this question

3 Answers 3

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:

#!/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
share|improve this answer

Your Answer

 
discard

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.