如何在 USB 设备插入(拔出)时运行代码,而不需要 root 权限?

Den*_*aia 5 usb hotplug dbus udev autorun

我有一个脚本,每当我将鼠标或键盘插入/拔出 USB 端口时,我都希望运行该脚本。

已经有大量关于如何配置 udev 规则以在插入或拔出设备时运行任意脚本的文档。但是配置这些规则需要 root 权限。而且,虽然我的机器上确实有 root 访问权限,但我正在寻找不需要 sudo、root 或编写 udev 规则的解决方案。(为什么?因为它会更容易运行、维护和分发)

最有可能的解决方案将使用 dbus,但我可能会误会。

(顺便说一句,我是高级用户和前Gentoo用户,请随意吐出技术细节!)


需要root的解决方案:

不需要root的看似过时的解决方案:

Den*_*aia 6

如何在 Python 中监听 Linux 中的‘USB 设备插入’事件? ”问题有一个使用pyudev的非常短的示例 Python 脚本。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()
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

14027 次

最近记录:

7 年,1 月 前