Solution 1 :
Je peux penser à deux façons de procéder :
L'une consiste à faire du service un service utilisateur plutôt qu'un service système.
Au lieu de créer une unité système, l'unité systemd sera placée sous le répertoire personnel de l'utilisateur du service, à $HOME/.config/systemd/user/daemon-name.service
. Le même utilisateur peut alors gérer le service avec systemctl --user <action> daemon-name.service
.
Pour permettre à l'unité utilisateur de démarrer au démarrage, root doit activer la persistance pour le compte, c'est-à-dire sudo loginctl enable-linger username
. L'unité doit également être WantedBy=default.target
.
L'autre méthode consiste à autoriser l'utilisateur à gérer l'unité centrale via PolicyKit. Cela nécessite systemd 226 ou supérieur (et PolicyKit>=0.106 pour les fichiers JavaScript rules.d - vérifiez avec pkaction --version
). Notez que Debian a délibérément retenu PolicyKit à une version 0.105 vieille de près de dix ans qui ne prend pas en charge cette fonctionnalité, apparemment à cause de l'opinion personnelle d'une personne, et ni lui ni les distributions qui en sont dérivées (comme Ubuntu) ne peuvent utiliser cette méthode.
Vous créeriez un nouveau fichier de configuration PolicyKit, par ex. /etc/polkit-1/rules.d/57-manage-daemon-name.rules
qui vérifie les attributs que vous souhaitez autoriser. Par exemple :
// 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;
}
});
L'utilisateur nommé peut alors gérer le service nommé avec systemctl
et sans utiliser sudo
.
Solution 2 :
sudo
est fait pour ça. Modifiez votre /etc/sudoers
fichier avec visudo
pour ajouter un Cmd_alias
pour les commandes que vous souhaitez que l'utilisateur non privilégié puisse utiliser :
# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>
et ajoutez une ligne pour permettre à l'utilisateur non privilégié d'utiliser les commandes définies avec l'alias comme ceci :
unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS
Lisez plus de documentation sur le sujet pour les différents paramètres de la commande sudo.
Vous devrez peut-être installer sudo
paquet pour avoir sudo
disponible sur votre système.