sudo crontab通知の送信が機能しません

sudo crontab通知の送信が機能しません

同様の投稿を読みました。ここここここそしてここDISPLAY上記の環境変数がいくつかあり、ユーザーのDBUS_SESSION_BUS_ADDRESScrontabで動作するように通知を送信するユーザー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_ADDRESSnotify-send/etc/sudoerssudo

設定を変更してみることができます。詳細は取り上げません。また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"
'

関連情報