我正在一个无头的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; } });
指定的用户可以使用systemctl
pipe理指定的服务,而不使用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身份运行特定的命令。