Bash
sudo crontab 通知發送不起作用
我在這裡、這裡、這里和這裡讀過類似的文章,其中提到了一些環境變數
DISPLAY
和DBUS_SESSION_BUS_ADDRESS
. 將它們設置在我的使用者 crontab 的頂部使 notify-send 可以在我的使用者 crontab 中工作。但是,如果在 中設置,完全相同的 crontab 不起作用sudo crontab -e
,為什麼不呢?我怎樣才能讓它發揮作用?test.sh
#! /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
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" '