Configuration du service Systemd pour s'exécuter avec un accès root

21

J'ai un service sous la forme d'une application node.js configurée avec Systemd sur Raspbian Jessie et il utilise son propre compte utilisateur. Cependant, je constate que le service ne fonctionne pas correctement car il ne dispose pas des autorisations nécessaires. L'un des modules de nœuds que j'ai installés nécessite un accès root. Si j'exécute l'application manuellement avec sudo, tout fonctionne bien.

Existe-t-il un moyen de dire à systemd d'exécuter le service avec sudo?

Luc
la source
2
À quoi ressemble votre fichier d'unité, ajoutez-le à votre question? Exécute normalement systemdles fichiers d'unité avec les droits root.
Thomas

Réponses:

31

dire à systemd d'exécuter le service sudo?

sudo n'a rien à voir avec ça.

En règle générale, vous demandez à systemd d'exécuter un service en tant qu'utilisateur / groupe spécifique avec une directive User=et Group=dans la [Service]section du fichier d'unité.

Définissez-les sur root (ou supprimez-les, car l'exécution en tant que root est la valeur par défaut).

HBruijn
la source
Je l'avais configuré pour utiliser un utilisateur spécifique car j'utilisais un guide pour le configurer. Cependant, dans mon cas, ce n'était pas approprié. J'ai supprimé cela pour fonctionner en tant que root par défaut et maintenant tout fonctionne!
Luke
2
L'exécution en tant que root n'est pas tout à fait la même chose que l'exécution avec User=root. Voir ma réponse.
Mark Stosberg
Où ce fichier peut-il être édité?
Matthew
15

Pour effacer, les systemdservices système s'exécutent en tant que root par défaut, mais il existe toujours une différence entre le comportement par défaut et l'exécution d'un service système avec User=root.

Comme indiqué dans Variables d'environnement dans les processus générés , ces variables ne sont définies que si elles User=sont définies:

$USER, $LOGNAME, $HOME, $SHELL

J'ai testé pour confirmer cette conclusion. Donc, si vous souhaitez exécuter un service systemd en tant que root qui nécessite l'une des variables ci-dessus, vous devez définir User=root.

Mark Stosberg
la source
Je vous remercie! C'est la seule chose qui a fonctionné pour moi sur une application que j'ai
Pedro Torres
NB si vous définissez User = root, vous devriez probablement également définir Group = root :) superuser.com/a/1452367/39364
rogerdpack
2

une solution temporaire, mais l'a fait fonctionner en un rien de temps:

/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'

Peut fonctionner avec un utilisateur qui a les privilèges sudo dans un fichier d'unité systemd comme ceci:

[Unit]
Description=Rails Webserver
After=syslog.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/var/www/webserver
ExecStart=/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'
Restart=always
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target
daino3
la source
Cela a plusieurs problèmes: Premièrement, les deux premières réponses expliquent pourquoi l'utilisation d'un utilisateur puis de sudo n'est pas nécessaire et montrent la bonne façon de le faire. Deuxièmement, vous ne devriez pas exécuter votre application Web en tant que root de toute façon. Troisièmement, votre application Web doit se trouver derrière un serveur Web normal tel que nginx.
Michael Hampton
Je ne serai pas en désaccord avec vous sur aucun de vos points. Mais si quelqu'un, comme moi, voulait un stand-up simple, aussi rapide que possible d'un serveur, c'est une option viable qui fonctionne.
daino3
Presque aussi vite que possible. De toute évidence, l'utilisation sudoralentira un peu le démarrage. Et c'est inutile.
Michael Hampton
@MichaelHampton J'essaie d'écrire une porte dérobée, j'ai donc trouvé cette réponse utile!
P. Soutzikevich
1

Exécutez-le en tant qu'utilisateur système dans ce cas, par défaut, le service s'exécute en tant que root.

Umut
la source