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

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

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

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

最有可能的是,解决方案将使用 dbus,但我可能弄错了。

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


需要root权限的解决方案:

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

答案1

这 ”如何在 Python 中的 Linux 中监听“USB 设备插入”事件?“问题有一个非常简短的示例 Python 脚本,使用皮尤代夫device-event。通过监视子系统,该脚本可以轻松检测设备何时连接或断开连接usb

更重要的是,皮尤代夫是纯 Python 实现,适用于 Python 2 和 Python 3。

基于该示例代码,我编写了自动执行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()

相关内容