5 votes

Comment puis-je exécuter du code à chaque fois qu'un périphérique USB est (dé)branché, sans avoir besoin des droits root ?

J'ai un script que je souhaite exécuter chaque fois que je branche/débranche une souris ou un clavier sur mon port USB.

Il y a déjà beaucoup de documentation sur la façon de configurer les règles udev pour exécuter des scripts arbitraires lorsqu'un périphérique est branché ou débranché. Mais la configuration de ces règles nécessite les droits root. Et, bien que j'ai l'accès root sur ma machine, Je cherche une solution qui ne nécessite pas sudo, root, ou l'écriture de règles udev. (pourquoi ? parce qu'il sera plus facile à exécuter, à maintenir et à distribuer)

Le plus probable est que la solution utilise dbus, mais je peux me tromper.

(Au fait, je suis un utilisateur avancé et un ancien utilisateur de Gentoo, n'hésitez pas à cracher des détails techniques).


Des solutions qui nécessitent une racine :

Des solutions apparemment dépassées qui n'ont pas besoin de racine :

4voto

automatonic Points 2830

Le " Comment puis-je écouter les événements 'usb device inserted' sous Linux, en Python ? La question " Python " contient un très court exemple de script Python utilisant pyudev . Ce script peut facilement détecter quand un périphérique est connecté ou déconnecté, en surveillant la device-event de la usb sous-système.

Qui plus est, pyudev est une implémentation purement Python et est disponible à la fois pour Python 2 et Python 3.

En me basant sur cet exemple de code, j'ai écrit auto_exec_xinput_xset_upon_usb_device_change.py 参照 la version la plus récente ). Fonctionne à la fois sur Python 2 et 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.
    monitor.start()

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

if __name__ == '__main__':
    main()

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X