从花药 tty 我可以运行
DISPLAY=:0 notify-send hullo
并在我的牙腐会话中查看该消息。但如果我以 root 身份登录,这不起作用。也没有
USER=toothrot DISPLAY=:0 notify-send hullo
我如何让它从根开始工作?
我需要这个,因为我想创建一个影响我的 x 会话的 udev 规则。使用拱门。
答案1
X 可以有两种授权客户端的方式。一种方法是使用 cookie;那么你必须设置DISPLAY=:0
和XAUTHORITY=/home/yourusername/.Xauthority
。
在你的情况下,我假设它是通过 xhost 完成的,否则设置 DISPLAY 是不够的。键入xhost
以查看谁获得了授权。
也许您有一个~/.Xauthority
cookie 和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
来运行。DISPLAY
XAUTHORITY