在用户会话中使用 root 访问权限运行 systemd 服务

在用户会话中使用 root 访问权限运行 systemd 服务

org.freedesktop.Notifications我正在创建一个 systemd 服务,每当记录高优先级事件时,该服务都会通过 dbus 目标发送桌面通知。为此,我journalctl以 root 身份运行并在 Rust 程序中处理所有输出(journalctl在程序中作为子程序调用),可以近似如下:

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

我需要以 root 权限运行才能访问所有日志,但是当我将其设为 systemd 服务时,它不再起作用(在终端中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=gfaster当我将和添加Group=gfaster到文件中时,这个假设得到了证实.service,并且通知开始工作。然而,正如我之前提到的,这不起作用,因为我需要对日志进行根访问。

有什么办法可以解决这个问题吗?是否可以将此服务作为用户会话的一部分运行,但具有 root 权限?我是否只需要创建第二个与日志交互的服务,如果是这样,该配置是什么样的?

相关内容