我有一个脚本,希望在我将鼠标或键盘插入/拔出 USB 端口时运行该脚本。
关于如何配置 udev 规则以在设备插入或拔出时运行任意脚本的文档已经很多。但配置这些规则需要 root 权限。而且,虽然我在我的机器上确实有 root 访问权限,我正在寻找一种不需要 sudo、root 或编写 udev 规则的解决方案。(为什么?因为它将更容易运行、维护和分发)
最有可能的是,解决方案将使用 dbus,但我可能弄错了。
(顺便说一句,我是高级用户和前 Gentoo 用户,请随意透露技术细节!)
需要root权限的解决方案:
- 插入或拔出 USB 设备后自动运行脚本
- http://granjow.net/udev-rules.html
- http://hg.dfrank.ru/linux/my-udev-notify(从这个问题/答案)
看似过时的不需要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()