Lösung 1:
Dazu fallen mir zwei Möglichkeiten ein:
Einer besteht darin, den Dienst zu einem Benutzerdienst und nicht zu einem Systemdienst zu machen.
Anstatt eine System-Unit zu erstellen, wird die Systemd-Unit im Home-Verzeichnis des Dienstbenutzers unter $HOME/.config/systemd/user/daemon-name.service
abgelegt . Derselbe Benutzer kann dann den Dienst mit systemctl --user <action> daemon-name.service
verwalten .
Damit die Benutzereinheit beim Booten starten kann, muss root Linger für das Konto aktivieren, d. h. sudo loginctl enable-linger username
. Die Einheit muss auch WantedBy=default.target
sein .
Die andere Möglichkeit besteht darin, dem Benutzer den Zugriff zu gewähren, um die Systemeinheit über PolicyKit zu verwalten. Dies erfordert systemd 226 oder höher (und PolicyKit>=0.106 für die JavaScript rules.d-Dateien – prüfen Sie mit pkaction --version
). Beachten Sie, dass Debian PolicyKit absichtlich auf eine fast zehn Jahre alte Version 0.105 zurückgehalten hat, die diese Funktionalität nicht unterstützt, anscheinend aufgrund der persönlichen Meinung einer Person, und weder es noch davon abgeleitete Distributionen (wie Ubuntu) diese Methode verwenden können.
Sie würden eine neue PolicyKit-Konfigurationsdatei erstellen, z. /etc/polkit-1/rules.d/57-manage-daemon-name.rules
die nach den Attributen sucht, die Sie zulassen möchten. Zum Beispiel:
// 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;
}
});
Der Named User kann dann den Named Service mit systemctl
verwalten und ohne sudo
zu verwenden .
Lösung 2:
sudo
ist dafür gemacht. Bearbeiten Sie Ihre /etc/sudoers
Datei mit visudo
um eine Cmd_alias
hinzuzufügen für die Befehle, die der nicht privilegierte Benutzer verwenden soll:
# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>
und fügen Sie eine Zeile hinzu, um dem nicht privilegierten Benutzer zu erlauben, die mit dem Alias definierten Befehle wie folgt zu verwenden:
unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS
Lesen Sie weitere Dokumentation zum Thema für die verschiedenen Parameter des sudo-Befehls.
Möglicherweise müssen Sie sudo
installieren Paket muss sudo
haben auf Ihrem System verfügbar.