如何知道一个服务是用户服务还是系统服务?

如何知道一个服务是用户服务还是系统服务?

是否可以查询服务并知道它是从 发起lib/systemd/system还是从 发起/.config/systemd/user/

我正在编写一项systemd服务,目前我已将其放入lib/systemd/system以 root 身份运行的服务中,但我也想让它为每个用户工作。

我的服务中有一些检查,需要知道它是否具有 root 访问权限。这就是为什么我试图弄清楚我是否可以获得有关服务的此类信息。

我正在使用 Ubuntu,但我想知道该解决方案是否systemd也适用于其他使用的发行版。

答案1

假设您的主服务以 root 身份运行,您可以进行一个非常简单的测试,如下所示:

if(getuid() == 0)
{
    ...act as root...
}
else
{
    ...act as user...
}

您可能也对该功能感兴趣seteuid()。这允许您在用户之间进行更改,只有当您可以成为 root 用户然后切换到任何其他用户时,这才是真正可能的。如果可执行文件具有该s标志,您就可以成为 root,但对于服务而言,确实不建议这样做(默认情况下,systemd 会阻止此类更改发生)。

最后,systemd 允许您以 root 以外的用户身份运行多用户服务。这意味着它的标识符不会是0。如果你使用这样的功能,那么你需要先确定id。

struct passwd * p = getpwnam("my-global-service-user-name");
if(getuid() == p->pw_uid)
...

用户名可以是"root",该函数将返回/etc/passwd已设置为 0 的 root 用户的条目uid

相关内容