sudo crontab 通知发送不起作用

sudo crontab 通知发送不起作用

我读过类似的帖子这里,这里,这里这里其中提到了一些环境变量DISPLAYDBUS_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"
'

相关内容