Wie kann systemd einen Befehl als root ausführen, bevor ein Dienst als anderer Benutzer gestartet wird? [geschlossen]

7

Ich führe svnserve auf einem Fedora 17-Computer mit der folgenden systemd-Servicedatei aus:

[Unit]
Description=Subversion Server
After=syslog.target network.target

[Service]
User=svn
Type=forking
Environment=HOME=/repos/svn
ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /repos/svn
PIDFile=/run/svnserve/svnserve.pid

[Install]
WantedBy=multi-user.target

Dies funktioniert einwandfrei, solange / var / run / svnserve svn: svn gehört, wird jedoch beim Neustart unterbrochen, wenn dieser Besitz auf root: root zurückgesetzt wird. Ich möchte einen Pre-Launch-Schritt hinzufügen, der das Verzeichnis durchforstet.

Leider kann ich keine echte Dokumentation zu systemd-Einheitendateien finden, aber ich habe gesehen, dass einige 'ExecStartPre' verwenden, also habe ich Folgendes versucht:

ExecStartPre=/bin/chown svn:svn /run/svnserve

Leider schlägt dies mit dem Fehler "Operation nicht zulässig" fehl. Es sieht also so aus, als würde ExecStartPre auch als der in der Gerätedatei angegebene Benutzer ausgeführt.

Ich habe auch versucht, die Unit-Datei als root auszuführen und dann svnserve als svn-Benutzer über su zu starten, aber das führte zu einem vagen Fehler, dass die Befehlszeile ungültig war.

Wie können systemd-Einheiten Aktionen als root ausführen, bevor sie als bestimmter Benutzer ausgeführt werden?

DNS
quelle
Sie melden dies als Fehler. Die Berechtigungen sollten für das /runVerzeichnis und die PID-Datei bereits korrekt sein , aber viele davon sind mit dem Wechsel zu systemd und dem /usrVerschieben kaputt gegangen .
Michael Hampton
@ MichaelHampton Ich glaube nicht, dass es so aus der Box kam. IIRC (dies wurde vor einiger Zeit eingerichtet) svnserve wird ohne Service-Wrapper geliefert, daher haben wir dies selbst geschrieben.
DNS
1
Subversion auf Fedora sicherlich nicht mit diesem kommen. Es sieht Ihrem ziemlich ähnlich, obwohl ich empfehlen würde, das Original zu verwenden. yum reinstall subversion
Michael Hampton
Wenn Sie Ihre su-Befehlszeile angegeben haben, können wir dieses Problem möglicherweise lösen.
Hauke ​​Laging
1
PermissionsStartOnly=falsebewirkt, dass alle ExecStartPreund ExecStartPostBefehle ignoriert werden Userund als root ausgeführt werden.
Charles Duffy

Antworten:

8

Das Subversion-Paket in Fedora verwendet den tmpfiles-Mechanismus von systemd, um /run/svnservebeim Booten mit Root-Besitz zu erstellen (da die gepackte .service-Datei den Daemon anscheinend als root ausführt). Sie könnten kopieren /usr/lib/tmpfiles.d/svnserve.confzu /etc/tmpfiles.d/svnserve.confund die Besitzer ändern. Siehe man tmpfiles.dfür Details.

Chris Williams
quelle
1
Aha; Ich hatte keine Ahnung, dass es einen tmpfiles-Mechanismus gibt. Vielen Dank!
DNS
0

Sie können ExecStartPre zu einem Sudo-Aufruf eines Skripts machen und den Benutzer svn für dieses Skript konfigurieren.

Hauke ​​Laging
quelle
Kann kein Sudo verwenden; Beim Ausführen von systemd-Einheiten gibt es kein TTY.
DNS
Warum sollte sudo ein tty benötigen, wenn kein Passwort benötigt wird?
Hauke ​​Laging
2
Darüber hinaus weist die Einstellung PermissionsStartOnly=falsesystemd an und für sich an, ausgeführt zu werden ExecStartPreund ExecStartPostals root zu verarbeiten.
Charles Duffy
4
@Davos, in diesem Fall verwenden Sie einfach einen Vorgänger +für die ExecStartPre; ExecStartPre=+/path/to/thing-to-run-as-root;; Auf diese Weise wenden Sie eine Änderung nur auf diesen einen bestimmten Befehl an und nehmen überhaupt keine globalen Änderungen vor.
Charles Duffy
2
nod - Der Nachteil dieser Vorgehensweise besteht darin, dass alle anderen Pre / Post-Befehle, die von Dropins, Generatoren usw. hinzugefügt werden, ebenfalls von PermissionStartOnly betroffen sind. Ein +Präfix ist garantiert lokalisiert.
Charles Duffy