web-dev-qa-db-ja.com

ルート権限を必要とせずに、USBデバイスが(接続されていない)いつでもコードを実行するにはどうすればよいですか?

USBポートにマウスまたはキーボードを接続/取り外しするたびに実行したいスクリプトがあります。

デバイスの接続時または接続解除時に任意のスクリプトを実行するためのudevルールの設定方法に関するドキュメントはすでにたくさんあります。ただし、これらのルールを構成するには、ルート権限が必要です。そして、私は自分のマシンにルートアクセスがありますが、Sudo、root、またはudevルールの記述を必要としないソリューションを探しています。 (理由は、実行、保守、配布が簡単になるためです)

ほとんどの場合、ソリューションではdbusを使用しますが、間違っている可能性があります。

(ちなみに、私は上級ユーザーであり、かつてのGentooユーザーです。技術的な詳細を自由に吐き出してください!)


ルートが必要なソリューション:

ルートを必要としない一見古くなったソリューション:

3

PythonでLinuxの「usbデバイスが挿入された」イベントをリッスンするにはどうすればよいですか? 」の質問には、 pyudev を使用した非常に短いサンプルPythonスクリプトがあります。このスクリプトは、usbサブシステムからdevice-eventを監視することにより、デバイスが接続または切断されたことを簡単に検出できます。

さらに、 pyudev はpure-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 __== '__main__':
    main()
3