我正在一个无头的Linux机器上运行一个私人游戏服务器。 因为我不是白痴,所以说服务器作为自己的非特权用户运行,只需要最小的访问权限就可以下载更新并修改世界数据库。
我还创build了一个systemd单元文件,以便在需要时正确启动,停止和重新启动服务器(例如,对于所述更新)。
但是,为了实际调用systemctl或service <game> start/stop/restart我仍然需要以root用户或sudo能力用户身份login。
有没有办法告诉systemd对于<game>服务,非特权用户gamesrv被允许运行start / stop / restart命令?
我可以想到两种方法来做到这一点:
一种是使服务成为用户服务而不是系统服务。
systemd单元将被放置在$HOME/.config/systemd/user/daemon-name.service服务用户的主目录下,而不是创build一个系统单元。 然后,同一个用户可以使用systemctl --user <action> daemon-name.service来pipe理这个服务 。
为了允许用户单元在启动时启动 ,root用户必须启用该帐户的逗留,即sudo loginctl enable-linger username 。 单位也必须WantedBy=default.target 。
另一种方式是允许用户通过PolicyKit访问pipe理系统单元。 这需要systemd 226或更高版本。
您将创build一个新的PolicyKitconfiguration文件,例如/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; } });
指定的用户可以使用systemctlpipe理指定的服务,而不使用sudo 。
sudo是为此而制作的。 用visudo编辑你的/etc/sudoers文件,为你希望非特权用户可以使用的命令添加一个Cmd_alias :
# game server commands Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>
并添加一行以允许非特权用户使用以下别名定义的命令:
unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS
请阅读关于sudo命令的各种参数的更多文档 。
您可能需要安装sudo软件包才能在系统上使用sudo 。
您可以将sudo与提供等同于root访问相关联,但也可以使用它来允许特定的用户root访问特定的,有限的一组命令。
如何在服务器错误上解决这个问题,如[在没有sudo的情况下将一组命令的访问权限授予非root用户,而没有使用sudo权限访问非root用户的命令)。
使用PolicyKit仍然不常见。 使用systemd“用户单元”应该可以正常工作,但是历史上你的目标已经被使用sudo的能力来允许用户以root身份运行特定的命令。