I have a script that I wish to run whenever I plug/unplug a mouse or keyboard to my USB port.

There is already plenty of documentation on how to configure udev rules to run arbitrary scripts when a device is plugged or unplugged. But configuring those rules requires root permissions. And, although I do have root access on my machine, I'm looking for a solution that does not require sudo, root, or writing udev rules. (why? because it will be easier to run, maintain and distribute)

Most likely, the solution will use dbus, but I might be mistaken.

(By the way, I'm and advanced user and former Gentoo user, feel free to spit out technical details!)

Solutions that require root:

Seemingly outdated solutions that don't need root:

  • askubuntu.com/questions/159007/… could help?
    – Tim
    Aug 26, 2014 at 15:11
  • "(why? because it will be easier to run, maintain and distribute)" I would include "easier to abuse". If anyone could hook a script onto an USB device it would be far too easy to abuse. You probably will need sudo/root to set this up (and circumventing like @Tim suggest is also using root ;) )
    – Rinzwind
    Aug 26, 2014 at 15:11
  • @Rinzwind it would need it for set up - but most things do, like installing any program - that ^^ doesn't need root each time, or each startup....
    – Tim
    Aug 26, 2014 at 15:14
  • @Tim solution is overkill. It is a nice feature, indeed, but overkill. Essentially, I want to run some xset and xinput commands to reconfigure my mice and touchpad whenever one of them gets connected. Aug 26, 2014 at 15:18
  • What do you want it to do with the information that one has been unplugged? Would a script running every 30 secs comparing the difference between xinput then and now work?
    – Tim
    Aug 26, 2014 at 15:22

1 Answer 1


The "How can I listen for 'usb device inserted' events in Linux, in Python?" question has a very short sample Python script using pyudev. That script can easily detect when a device is connected or disconnected, by monitoring the device-event from the usb subsystem.

What's more, pyudev is pure-python implementation and is available on both Python 2 and Python 3.

Based on that sample code, I've written auto_exec_xinput_xset_upon_usb_device_change.py (see also the most recent version). Works on both Python 2 and Python 3.

#!/usr/bin/env python

import functools
import os.path
import pyudev
import subprocess

def main():
    BASE_PATH = os.path.abspath(os.path.dirname(__file__))
    path = functools.partial(os.path.join, BASE_PATH)
    call = lambda x, *args: subprocess.call([path(x)] + list(args))

    context = pyudev.Context()
    monitor = pyudev.Monitor.from_netlink(context)
    monitor.filter_by(subsystem='usb')  # Remove this line to listen for all devices.

    for device in iter(monitor.poll, None):
        # I can add more logic here, to run only certain kinds of devices are plugged.

if __name__ == '__main__':

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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