Bash

sudo crontab 通知發送不起作用

  • May 8, 2021

我在這裡這裡這里這裡讀過類似的文章,其中提到了一些環境變數DISPLAYDBUS_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"
'

引用自:https://unix.stackexchange.com/questions/648690