비슷한 게시물을 읽었습니다.여기,여기,여기그리고여기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
대상 사용자로 실행되어야 합니다. 스크립트를 루트로 실행하려면 스크립트에 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"
'