ユーザーセッションでrootアクセスでsystemdサービスを実行する

ユーザーセッションでrootアクセスでsystemdサービスを実行する

org.freedesktop.Notifications優先度の高いイベントが記録されるたびに、dbusターゲットを介してデスクトップ通知を送信するシステムサービスを作成しています。これを行うには、journalctlrootとして実行し、Rustプログラム(journalctlプログラム内のサブルーチンと呼ばれる)のすべての出力を処理します。これは、次のようにおおよその計算が可能です。

sudo journalctl -focat -p3 -Snow | xargs -I{} -d '\n' notify-send {}

すべてのログにアクセスするにはrootとして実行する必要がありますが、システムサービスとして作成すると機能しなくなります(端末で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を取得し、それを使用してセッションバスを取得しようとします。ただし、rootとして実行されているため、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=gfasterGroup=gfasterファイルにおよびを追加すると、この前提が確認され、.service通知が機能し始めました。しかし、前述のように、ログへのルートアクセスが必要なため、機能しません。

この問題を解決する方法はありますか?このサービスはユーザーセッションの一部として実行できますが、root権限はありますか?ログと対話する2番目のサービスを作成するだけですか?では、その構成はどうなりますか?

ベストアンサー1

おすすめ記事