![我可以将当前 x 显示用户作为 udev 规则中的参数传递吗?](https://linux22.com/image/1468945/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%B0%86%E5%BD%93%E2%80%8B%E2%80%8B%E5%89%8D%20x%20%E6%98%BE%E7%A4%BA%E7%94%A8%E6%88%B7%E4%BD%9C%E4%B8%BA%20udev%20%E8%A7%84%E5%88%99%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92%E5%90%97%EF%BC%9F.png)
我已经设置了一条 udev 规则,它会重新启动 systemd 服务,并传递该服务要运行的用户参数。
问题是 udev 以 root 身份运行,因此它总是将 root 作为参数传入。我想以某种方式获取拥有 DISPLAY 0 的用户并将其作为参数传入。
背景介绍:我正在尝试使用 udevil 实现 USB 驱动器和光学媒体的自动安装,在任何用户下,无需桌面环境的帮助。
这可能吗?
这是我当前的规则:
# check for blockdevices, /dev/sd*, /dev/sr* and /dev/mmc*
SUBSYSTEM!="block", KERNEL!="sd*|sr*|mmc*", GOTO="exit"
# check for special partitions we dont want mount
IMPORT{builtin}="blkid"
ENV{ID_FS_LABEL}=="EFI|BOOT|Recovery", GOTO="exit"
# /dev/sd* and /dev/mmc* ith partitions/disk and filesystems only and /dev/sr* disks only
KERNEL=="sd*|mmc*", ENV{DEVTYPE}=="partition|disk", ENV{ID_FS_USAGE}=="filesystem", GOTO="harddisk"
KERNEL=="sr*", ENV{DEVTYPE}=="disk", GOTO="optical"
GOTO="exit"
# mount or umount for hdds
LABEL="harddisk"
ACTION=="add", RUN+="/usr/bin/systemctl restart udevil-mount@/dev/%k.service"
ACTION=="remove", RUN+="/usr/bin/systemctl stop udevil-mount@/dev/%k.service"
GOTO="exit"
# mount or umount for opticals
LABEL="optical"
ACTION=="add|change", RUN+="/usr/bin/systemctl restart udevil-mount@/dev/%k.service"
GOTO="exit"
# Exit
LABEL="exit"
答案1
不,没有什么好的纹身方法。
在 Unix 中是没有“当前”用户或当前显示,也无法保证显示 :0 随时存在并属于实际用户。甚至微软多年前就认识到让服务“进入”用户会话是一个坏主意(导致“会话 0 隔离”)。
在用户的图形会话中运行devmon
守护进程(或者udiskie
作为替代方案,可能是 thunar-volman)(例如通过 /etc/xdg/autostart 或 /etc/X11/xinitrc.d 启动它)。让它以这种方式监视 udev 事件。