同様の投稿を読みました。ここ、ここ、ここそしてここDISPLAY
上記の環境変数がいくつかあり、ユーザーのDBUS_SESSION_BUS_ADDRESS
crontabで動作するように通知を送信するユーザーcrontabの上部に設定します。しかし、に同じcrontabを設定しても機能しませんsudo crontab -e
。それではなぜなぜですか?どのように動作させることができますか?
テストファイル
#! /bin/bash
env > $1
notify-send "I want to see this"
クローンタップ-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"
スクリプトを処理するシェルが拡張されると、$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"
'