以 root 身份执行脚本以影响非 root x 会话

以 root 身份执行脚本以影响非 root x 会话

从花药 tty 我可以运行

DISPLAY=:0 notify-send hullo

并在我的牙腐会话中查看该消息。但如果我以 root 身份登录,这不起作用。也没有

USER=toothrot DISPLAY=:0 notify-send hullo

我如何让它从根开始工作?

我需要这个,因为我想创建一个影响我的 x 会话的 udev 规则。使用拱门。

答案1

X 可以有两种授权客户端的方式。一种方法是使用 cookie;那么你必须设置DISPLAY=:0XAUTHORITY=/home/yourusername/.Xauthority

在你的情况下,我假设它是通过 xhost 完成的,否则设置 DISPLAY 是不够的。键入xhost以查看谁获得了授权。

也许您有一个~/.Xauthoritycookie 和xhost +SI:localuser:toothrot授权。

您可以允许 root 使用 访问 display:0 DISPLAY=:0 xhost +SI:localuser:root,但您必须以普通用户身份执行此操作。使用 cookie 是更好的方法:

DISPLAY=:0 XAUTHORITY=/home/toothrot/.Xauthority notify-send hullo

以用户身份执行通知发送:

su toothrot -c 'DISPLAY=:0 XAUTHORITY=/home/toothrot/.Xauthority notify-send hullo'

答案2

想必您很久以前就解决了您的问题,但为了完成,通用解决方案是(改编自这里):

$ my_user="toothrot"
$ my_user_id=$(more /etc/passwd | awk -F: '/^'${my_user}':/ {print $3}')
$ sudo -u $my_user DISPLAY=':0' DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${my_user_id}/bus /usr/bin/notify-send "hullo"

如果您有多个屏幕会话显示,您的里程可能会有所不同显示=“:0”关心的是上面的事情。不过那是另一篇文章了。

答案3

上面的答案有点粗糙,并且对于多个用户或多个显示器来说不能干净地工作。如果用户符号链接~/.Xauthority到受保护的文件,则可能会发生权限升级攻击。另一种选择可能是udev完全忘记并使用乌德夫,它在您自己的 X 会话中以非 root 身份运行。您只需设置一个~/.config/uudev.conf包含以下内容的文件:

* ACTION="bind", DRIVER="whatever", ...
notify-send hullo

如果您systemctl --user restart uudev从您的~/.xsession~/.xinitrc文件中运行,那么将仅使用已设置的适当变量notify-send来运行。DISPLAYXAUTHORITY

相关内容