我读过类似的帖子这里,这里,这里和这里其中提到了一些环境变量DISPLAY
和DBUS_SESSION_BUS_ADDRESS
.将它们设置在我的用户 crontab 的顶部,使通知发送能够在我的用户 crontab 中工作。但是,如果在 中设置完全相同的 crontab 则不起作用sudo crontab -e
,为什么不呢?我怎样才能让它发挥作用?
测试文件
#! /bin/bash
env > $1
notify-send "I want to see this"
crontab -e
SHELL=/bin/bash
PATH="/usr/bin:/home/ripytide/scripts/"
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DISPLAY=:0
* * * * * test.sh /home/ripytide/crontab.env
sudo crontab-e
SHELL=/bin/bash
PATH="/usr/bin:/home/ripytide/scripts/"
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DISPLAY=:0
* * * * * test.sh /home/ripytide/sudocrontab.env
crontab.env
SHELL=/bin/bash
PWD=/home/ripytide
LOGNAME=ripytide
_=/usr/bin/env
HOME=/home/ripytide
LANG=en_GB.UTF-8
USER=ripytide
DISPLAY=:0
SHLVL=1
PATH=/usr/bin:/home/ripytide/scripts/
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
sudocrontab.env
SHELL=/bin/bash
PWD=/root
LOGNAME=root
_=/usr/bin/env
HOME=/root
LANG=en_GB.UTF-8
USER=root
DISPLAY=:0
SHLVL=1
PATH=/usr/bin:/home/ripytide/scripts/
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
答案1
D-Bus 检查调用进程和会话守护进程的 UID 是否相同。您的脚本需要notify-send
以目标用户身份运行。如果您坚持以 root 身份运行脚本,那么在脚本中您需要sudo -u user notify-send …
.
请记住sudo
清理环境,因此DBUS_SESSION_BUS_ADDRESS
从脚本的环境不会到达环境notify-send
(/etc/sudoers
并且安全策略可能允许sudo
保留变量,但在您的情况下,默认情况下这可能不会发生)。
你可以尝试改变一下设置,我就不详细说了。还有sudo -E
(参见man 8 sudo
)。侵入性最小的方法是请求sudo
按需设置变量:
sudo -u user DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS" \
notify-send "I want to see this"
当处理脚本的 shell 展开时$DBUS_SESSION_BUS_ADDRESS
,命令变为:
sudo -u user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
notify-send "I want to see this"
这个表格也可以直接使用,就看你自己了。
一般来说,sudo
即使这样也可以配置为不允许设置变量。在最坏的情况下,以下应该有效:
sudo -u user sh -c '
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "I want to see this"
'