org.freedesktop.Notifications
우선 순위가 높은 이벤트가 기록될 때마다 dbus 대상을 통해 데스크톱 알림을 보내는 시스템 서비스를 만들고 있습니다. 이를 위해 journalctl
루트로 실행하고 Rust 프로그램( journalctl
프로그램 내에서 서브루틴이라고 함)의 모든 출력을 처리합니다. 이는 다음과 같이 대략적으로 계산할 수 있습니다.
sudo journalctl -focat -p3 -Snow | xargs -I{} -d '\n' notify-send {}
모든 로그에 액세스하려면 루트로 실행해야 하지만 시스템 서비스로 만들면 더 이상 작동하지 않습니다( 터미널에서 journalctl
실행할 때도 작동하지 않습니다 ). sudo
내 (축약된) .service
파일은 다음과 같습니다.
[Unit]
Requires=dbus.service
[Service]
WorkingDirectory=~
ExecStart=/usr/bin/auditnotify
Restart=always
PrivateTmp=true
NoNewPrivileges=true
[Install]
Alias=auditnotify
WantedBy=default.target
서비스를 확인한 후 strace
무슨 일이 일어나고 있는지 확인했습니다.zbus
내가 사용하고 있는 알림 상자의 종속성은notify-rust
, UID를 가져온 다음 이를 사용하여 세션 버스를 가져오려고 합니다. 그러나 루트로 실행 중이므로 UID가 0이고 알림을 보낼 수 없습니다.
strace
출력 스니펫:
geteuid() = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/run/user/0/bus"}, 18) = -1 ENOENT (No such file or directory)
close(3) = 0
User=gfaster
Group=gfaster
파일에 및를 추가했을 때 이 가정이 확인되었고 .service
알림이 작동하기 시작했습니다. 그러나 앞서 언급했듯이 로그에 대한 루트 액세스가 필요하기 때문에 작동하지 않습니다.
이 문제를 해결할 방법이 있나요? 이 서비스를 사용자 세션의 일부로 실행할 수 있지만 루트 권한이 있습니까? 로그와 상호작용하는 두 번째 서비스를 생성하기만 하면 됩니까? 그렇다면 해당 구성은 어떻게 됩니까?