我在无头 linux 机器上运行私人游戏服务器。因为我不是白痴,所以说服务器作为它自己的非特权用户运行,具有下载更新和修改世界数据库所需的最低访问权限。
我还创建了一个 systemd 单元文件,以便在需要时正确启动、停止和重新启动服务器(例如,对于上述更新)。
但是,为了实际调用systemctl
或者service <game> start/stop/restart
我仍然需要以 root 或有sudo
能力的用户身份登录。
有没有办法告诉 systemd 对于该<game>
服务,gamesrv
允许非特权用户运行启动/停止/重启命令?
Mic*_*ton 62
我可以想到两种方法来做到这一点:
一种是使服务成为用户服务而不是系统服务。
systemd 单元将放置在服务用户的主目录下,而不是创建系统单元$HOME/.config/systemd/user/daemon-name.service
。然后同一个用户可以管理服务与systemctl --user <action> daemon-name.service
。
要允许用户单元在启动时启动,root 必须为该帐户启用 linger,即sudo loginctl enable-linger username
. 单位也必须是WantedBy=default.target
。
另一种方式是允许用户通过 PolicyKit 访问管理系统单元。这需要 systemd 226 或更高版本(对于 JavaScript rules.d 文件,PolicyKit >= 0.106 – 检查pkaction --version
)。请注意,Debian 故意将 PolicyKit 推迟到近十年前的 0.105 版本,该版本不支持此功能,显然是因为个人意见,无论是它还是从它派生的发行版(如 Ubuntu)都不能使用这种方法。
您将创建一个新的 PolicyKit 配置文件,例如/etc/polkit-1/rules.d/57-manage-daemon-name.rules
检查您想要允许的属性。对于例如:
// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "example.service" &&
subject.user == "alice") {
return polkit.Result.YES;
}
});
Run Code Online (Sandbox Code Playgroud)
然后,命名用户可以使用systemctl
或不使用 来管理命名服务sudo
。
Hen*_*gel 21
sudo
是为此而生的。编辑您的/etc/sudoers
文件,visudo
为Cmd_alias
您希望非特权用户能够使用的命令添加一个:
# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>
Run Code Online (Sandbox Code Playgroud)
并添加一行以允许非特权用户使用使用别名定义的命令,如下所示:
unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS
Run Code Online (Sandbox Code Playgroud)
阅读有关该主题的更多文档,了解sudo 命令的各种参数。
您可能需要安装sudo
软件包才能sudo
在您的系统上使用。