Systemd Service für die Ausführung mit Root-Zugriff konfigurieren

20

Ich habe einen Dienst in Form einer node.js-Anwendung, die mit Systemd auf Raspbian Jessie eingerichtet wurde und ein eigenes Benutzerkonto verwendet. Ich stelle jedoch fest, dass der Dienst nicht ordnungsgemäß ausgeführt wird, da er nicht über die erforderlichen Berechtigungen verfügt. Eines der von mir installierten Knotenmodule erfordert Root-Zugriff. Wenn ich die Anwendung manuell mit sudo starte, funktioniert alles einwandfrei.

Gibt es eine Möglichkeit, systemd anzuweisen, den Dienst mit sudo auszuführen?

Luke
quelle
2
Wie sieht deine Unit-Datei aus, füge sie deiner Frage hinzu? Normalerweise werden systemddie Unit-Dateien mit Root-Rechten ausgeführt.
Thomas

Antworten:

30

Sagen Sie systemd, dass der Dienst ausgeführt werden soll sudo?

sudo hat nichts damit zu tun.

In der Regel weisen Sie systemd an, einen Dienst als einen bestimmten Benutzer / eine bestimmte Gruppe mit der Anweisung User=und Group=im [Service]Abschnitt der Unit-Datei auszuführen .

Setzen Sie diese auf "root" (oder entfernen Sie sie, da "running as root" die Standardeinstellung ist).

HBruijn
quelle
Ich hatte es eingerichtet, um einen bestimmten Benutzer zu verwenden, da ich eine Anleitung zum Konfigurieren verwendete. In meinem Fall war dies jedoch nicht angemessen. Ich habe dies entfernt, um es als root auszuführen und jetzt funktioniert alles!
Luke
2
Als root zu laufen ist nicht ganz dasselbe wie mit User=root. Siehe meine Antwort.
Mark Stosberg
Wo kann diese Datei bearbeitet werden?
Matthew
15

Zum Löschen werden systemdSystemdienste standardmäßig als Root ausgeführt, es besteht jedoch immer noch ein Unterschied zwischen dem Standardverhalten und dem Ausführen eines Systemdienstes mit User=root.

Wie in Umgebungsvariablen in gespawnten Prozessen dokumentiert , werden diese Variablen nur gesetzt, wenn User=gesetzt ist:

$USER, $LOGNAME, $HOME, $SHELL

Ich habe getestet, um diesen Befund zu bestätigen. Wenn Sie also einen systemd-Dienst als root ausführen möchten, der eine der oben genannten Variablen benötigt, müssen Sie festlegen User=root.

Mark Stosberg
quelle
Vielen Dank! Das war das einzige, was für mich bei einer Bewerbung funktioniert hat
Pedro Torres,
NB wenn Sie Set User = root sollten Sie wahrscheinlich auch Gruppen gesetzt = root :) superuser.com/a/1452367/39364
rogerdpack
2

eine vorübergehende Lösung, die aber zur Not funktioniert:

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

Kann mit einem Benutzer ausgeführt werden, der über folgende sudo-Berechtigungen in einer systemd-Unit-Datei verfügt:

[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
quelle
Dies hat mehrere Probleme: Zuerst erklären die ersten beiden Antworten, warum die Verwendung eines Benutzers und dann von sudo unnötig ist, und zeigen den richtigen Weg, dies zu tun. Zweitens sollten Sie Ihre Webanwendung sowieso nicht als root ausführen. Drittens sollte sich Ihre Web-App hinter einem normalen Webserver wie nginx befinden.
Michael Hampton
Ich werde Ihnen in keinem Ihrer Punkte widersprechen. Aber wenn jemand wie ich einen Server haben möchte, der so schnell wie möglich einsatzbereit ist, ist dies eine praktikable Option, die funktioniert.
Daino3
Fast so schnell wie möglich. Offensichtlich sudoverlangsamt die Verwendung den Start ein wenig. Und es ist unnötig.
Michael Hampton
@MichaelHampton Ich versuche, eine Hintertür zu schreiben, daher habe ich diese Antwort als hilfreich empfunden!
P. Soutzikevich
1

Führen Sie es als Systembenutzer aus. In diesem Fall wird der Dienst standardmäßig als Root ausgeführt.

Umut
quelle