我在无头 linux 机器上运行私人游戏服务器。因为我不是白痴,所以说服务器作为自己的非特权用户运行,具有下载更新和修改世界数据库所需的最低访问权限。
我还创建了一个 systemd 单元文件,以便在需要时正确启动、停止和重新启动服务器(例如,对于上述更新)。
但是,为了真正打电话systemctl
,service <game> start/stop/restart
我仍然需要以 root 或有sudo
能力的用户身份登录。
有没有办法告诉 systemd 对于该服务,允许<game>
非特权用户运行启动/停止/重启命令?gamesrv
我可以想到两种方法来做到这一点:
一种是使服务成为用户服务而不是系统服务。
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
检查您想要允许的属性。例如:_然后,命名用户可以使用
systemctl
和不使用sudo
.sudo
是为此而生的。编辑您的/etc/sudoers
文件,为您希望非特权用户能够使用的命令visudo
添加一个:Cmd_alias
并添加一行以允许非特权用户使用使用别名定义的命令,如下所示:
阅读有关该主题的更多文档,了解 sudo 命令的各种参数。
您可能需要安装
sudo
软件包才能sudo
在您的系统上使用。您可以
sudo
与提供等效于 的访问权限相关联root
,但它也可用于允许特定用户 root 访问特定的有限命令集。如何在服务器故障上已经回答了这个问题,在 [在没有 sudo的情况下向非 root 用户授予一组命令的访问权限,在没有 sudo 的情况下向非 root 用户授予一组命令的访问权限)。
使用 PolicyKit 仍然不常见。
sudo
使用 systemd “用户单元”应该可以正常工作,但从历史上看,您的目标已经通过使用允许用户以 root 身份运行特定命令的能力多次实现。