Soluzione 1:
Posso pensare a due modi per farlo:
Uno è rendere il servizio un servizio per l'utente piuttosto che un servizio di sistema.
Invece di creare un'unità di sistema, l'unità systemd verrà posizionata nella home directory dell'utente del servizio, in $HOME/.config/systemd/user/daemon-name.service
. Lo stesso utente può quindi gestire il servizio con systemctl --user <action> daemon-name.service
.
Per consentire all'unità utente di avviarsi all'avvio, root deve abilitare linger per l'account, ad esempio sudo loginctl enable-linger username
. Anche l'unità deve essere WantedBy=default.target
.
L'altro modo consiste nel consentire all'utente di accedere alla gestione dell'unità di sistema tramite PolicyKit. Ciò richiede systemd 226 o superiore (e PolicyKit>=0.106 per i file JavaScript rules.d – controlla con pkaction --version
). Si noti che Debian ha deliberatamente trattenuto PolicyKit a una versione 0.105 vecchia di quasi dieci anni che non supporta questa funzionalità, apparentemente a causa dell'opinione personale di una persona, e né esso né le distribuzioni da esso derivate (come Ubuntu) possono utilizzare questo metodo.
Dovresti creare un nuovo file di configurazione di PolicyKit, ad es. /etc/polkit-1/rules.d/57-manage-daemon-name.rules
che verifica gli attributi che si desidera consentire. Ad esempio:
// 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'utente denominato può quindi gestire il servizio denominato con systemctl
e senza usare sudo
.
Soluzione 2:
sudo
è fatto per questo. Modifica il tuo /etc/sudoers
file con visudo
per aggiungere un Cmd_alias
per i comandi che vuoi che l'utente senza privilegi possa usare:
# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>
e aggiungi una riga per consentire all'utente non privilegiato di utilizzare i comandi definiti con l'alias in questo modo:
unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS
Leggi altra documentazione sull'argomento per i vari parametri del comando sudo.
Potrebbe essere necessario installare sudo
pacchetto per avere sudo
disponibile sul tuo sistema.