Den*_*aia 5 usb hotplug dbus udev autorun
我有一个脚本,每当我将鼠标或键盘插入/拔出 USB 端口时,我都希望运行该脚本。
已经有大量关于如何配置 udev 规则以在插入或拔出设备时运行任意脚本的文档。但是配置这些规则需要 root 权限。而且,虽然我的机器上确实有 root 访问权限,但我正在寻找不需要 sudo、root 或编写 udev 规则的解决方案。(为什么?因为它会更容易运行、维护和分发)
最有可能的解决方案将使用 dbus,但我可能会误会。
(顺便说一句,我是高级用户和前Gentoo用户,请随意吐出技术细节!)
需要root的解决方案:
不需要root的看似过时的解决方案:
“如何在 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 次 |
| 最近记录: |