Como posso executar o código sempre que um dispositivo USB é (des) conectado, sem exigir permissões de root?

3

Eu tenho um script que desejo executar sempre que eu conecto / desconecte um mouse ou teclado à porta USB.

Já existe muita documentação sobre como configurar as regras do udev para executar scripts arbitrários quando um dispositivo é conectado ou desconectado. Mas a configuração dessas regras requer permissões de root. E, embora eu tenha acesso root na minha máquina, estou procurando uma solução que não exija sudo, root ou escrever regras do udev. (por que? Porque será mais fácil de executar, manter e distribuir)

Provavelmente, a solução usará o dbus, mas posso estar enganado.

(A propósito, eu sou usuário avançado e antigo usuário do Gentoo, fique à vontade para citar detalhes técnicos!)

Soluções que exigem raiz:

Soluções aparentemente desatualizadas que não precisam de root:

por Denilson Sá Maia 07.08.2014 / 19:39

1 resposta

3

O " Como posso ouvir eventos 'usb device inserted' no Linux, em Python? "a pergunta tem um script Python de amostra muito curto usando pyudev . Esse script pode detectar facilmente quando um dispositivo é conectado ou desconectado, monitorando o device-event do subsistema usb .

Além do mais, o pyudev é uma implementação puramente python e está disponível no Python 2 e no Python 3.

Com base nesse código de exemplo, eu escrevi auto_exec_xinput_xset_upon_usb_device_change.py (consulte também < href="https://bitbucket.org/denilsons/small_scripts/src/default/auto_configure_upon_usb_device_change.py"> a versão mais recente ). Funciona no Python 2 e no 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()
    
por Denilson Sá Maia 26.08.2014 / 17:24