То, как я могу выполнить код каждый раз, когда USB-устройство (ООН), включилось, не требуя корневых полномочий?

У меня есть скрипт, который я хочу запустить каждый раз, когда я включаюсь/отключаю мышь или клавиатуру к моему USB-порту.

Уже существует много документации относительно того, как настроить правила udev запустить произвольные скрипты, когда устройство включается или отключается. Но конфигурирование тех правил требует корневых полномочий. И, хотя у меня действительно есть корневой доступ на моей машине, я ищу решение, которое не требует sudo, корня, или пишущий udev правила. (почему? потому что будет легче выполнить, поддержать и распределить),

Скорее всего, решение будет использовать dbus, но я мог бы ошибиться.

(Между прочим, я и опытный пользователь и бывший хинду пользователь, не стесняйтесь выкладывать технические детали!)


Решения, которые требуют корня:

На вид устаревшие решения, которые не должны базироваться:

3
задан 1 October 2018 в 19:42

1 ответ

" то, Как я могу прислушаться 'к USB-устройству, вставило' события в Linux в Python? " вопрос имеет очень краткий образец сценарий Python с помощью pyudev. Тот сценарий может легко обнаружить, когда устройство подключено или отключено путем контроля device-event от usb подсистема.

, Кроме того, pyudev является реализацией чистого Python и доступен и на Python 2 и на Python 3.

На основе того примера кода, я записал auto_exec_xinput_xset_upon_usb_device_change.py (см. также новая версия ). Работы и над Python 2 и над 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()
3
ответ дан 1 December 2019 в 16:29

Другие вопросы по тегам:

Похожие вопросы: