我希望每当我插入某个 USB 设备时,自动启动 GUI 应用程序。启动后,该应用程序在前台运行,不应以 root 身份运行。
我怎样才能做到这一点?
在我的特定情况下,每当我插入 Yubikey USB FIDO2/TOTP 硬件令牌时,我都希望运行Yubico Authenticator 。
我希望每当我插入某个 USB 设备时,自动启动 GUI 应用程序。启动后,该应用程序在前台运行,不应以 root 身份运行。
我怎样才能做到这一点?
在我的特定情况下,每当我插入 Yubikey USB FIDO2/TOTP 硬件令牌时,我都希望运行Yubico Authenticator 。
普通的 udev
RUN=
不合适在 udev 规则中直接使用 RUN 指令
RUN=/opt/yubico-authenticator/authenticator
不适合此目的。使用 systemd 的系统的解决方案
通过将 udev 规则与 systemd 用户服务相结合,可以在设备插件上运行 GUI 应用程序。请根据您的特定需求调整以下文件中的文件名
Description=
和行。ExecStart=
Systemd 用户服务
用户服务将使用您的常规用户权限在当前 GUI 会话范围内运行。
~/.local/share/systemd/user/yubico-authenticator.service
创建启动应用程序的systemd 服务文件:systemctl --user daemon-reload
systemctl --user start yubico-authenticator.service
,它应该启动该应用程序。使用 udev 启动服务
让 udev 在设备插件上自动启动服务。
/etc/udev/rules.d/10-yubikey.rules
内容如下:sudo systemctl restart udev.service
上述规则在供应商为 0x1050 的任何 USB 设备上触发,即 Yubico。通过
ENV{SYSTEMD_USER_WANTS}
,它告诉 systemd 启动名为 的用户yubico-authenticator.service
服务,该服务必须与先前创建的服务文件的文件名匹配。由于它告诉 systemd 设备需要运行一项服务,而不是在每个插件上启动一个可执行文件,所以 systemd 最多只启动一个实例。第一个插件会启动服务,后续设备拔出并重新插入或插入多个设备时不会生成其他实例。