Configurar el servicio Systemd para que se ejecute con acceso root

21

Tengo un servicio en forma de una aplicación node.js configurada con Systemd en Raspbian Jessie y está utilizando su propia cuenta de usuario. Sin embargo, descubro que el servicio no se ejecuta correctamente porque no tiene los permisos necesarios. Uno de los módulos de nodo que instalé requiere acceso de root. Si ejecuto la aplicación manualmente con sudo, todo funciona bien.

¿Hay alguna manera de decirle a systemd que ejecute el servicio con sudo?

Luke
fuente
2
¿Cómo se ve el archivo de su unidad, agréguelo a su pregunta? Normalmente systemdejecuta los archivos de la unidad con derechos de root.
Thomas

Respuestas:

31

decirle a systemd para ejecutar el servicio sudo?

sudo no tiene nada que ver con eso.

Por lo general, le indica a systemd que ejecute un servicio como un usuario / grupo específico con una directiva User=y Group=en la [Service]sección del archivo de la unidad.

Ajústelos a root (o elimínelos, ya que ejecutarse como root es el valor predeterminado).

HBruijn
fuente
Lo configuré para usar un usuario específico ya que estaba usando una guía para configurarlo. Sin embargo, en mi caso esto no era apropiado. Eliminé esto para ejecutar como root de forma predeterminada y ahora todo funciona.
Lucas,
2
Ejecutar como root no es lo mismo que ejecutar con User=root. Mira mi respuesta.
Mark Stosberg
¿Dónde se puede editar este archivo?
Mateo
15

Para borrar, los systemdservicios del sistema se ejecutan como root de forma predeterminada, pero aún existe una diferencia entre el comportamiento predeterminado y la ejecución de un servicio del sistema User=root.

Como se documenta en las variables de entorno en los procesos generados , estas variables solo se establecen si User=se establece:

$USER, $LOGNAME, $HOME, $SHELL

Probé para confirmar este hallazgo. Entonces, si desea ejecutar un servicio systemd como root que necesita una de las variables anteriores, debe configurarlo User=root.

Mark Stosberg
fuente
¡Gracias! Eso fue lo único que funcionó para mí en una aplicación que tengo
Pedro Torres
Nota: Si establece Usuario = raíz probablemente debería también establecer Grupo = raíz :) superuser.com/a/1452367/39364
rogerdpack
2

una solución temporal, pero consiguió que funcione en un apuro:

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

Puede ejecutarse con un usuario que tiene privilegios de sudo en un archivo de unidad systemd de la siguiente manera:

[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
fuente
Esto tiene múltiples problemas: primero, las dos primeras respuestas explican por qué es innecesario usar un usuario y luego sudo, y muestran la forma correcta de hacerlo. En segundo lugar, no deberías ejecutar tu aplicación web como root de todos modos. Tercero, su aplicación web debería estar detrás de un servidor web normal como nginx.
Michael Hampton
No estaré en desacuerdo con usted en ninguno de sus puntos. Pero si alguien, como yo, quisiera un servidor completo, tan rápido como sea posible, esta es una opción viable que funciona.
daino3
Casi tan rápido como puedas. Obviamente, el uso sudoretrasará un poco el inicio. Y es innecesario.
Michael Hampton
@MichaelHampton Estoy tratando de escribir una puerta trasera, ¡así que me pareció útil esta respuesta!
P. Soutzikevich
1

Ejecútelo como un usuario del sistema en este caso de forma predeterminada, el servicio se ejecuta como root.

Umut
fuente