Wie kann ich eine von einem systemd-Dienst erstellte Datei automatisch mit chmodden versehen?

Wie kann ich eine von einem systemd-Dienst erstellte Datei automatisch mit chmodden versehen?

Ich habe einen systemd-Dienst, der go-ethereum (geth) startet, der dann einen Unix-Socket erstellt, der als Steuerkonsole dient. Mein Problem ist, dass mein Benutzer keine Verbindung zum Unix-Socket herstellen kann, weil der Geth-Prozess der Gruppe nicht automatisch Schreibberechtigungen erteilt, obwohl mein Benutzer und der Benutzer des Dienstes beide in derselben Gruppe sind und die erstellte Datei automatisch sowohl dem Dienstbenutzer als auch der Gruppe gehört. Ich kann das selbst beheben, indem ich es sudo chmod 660 /path/to/socketvon einem Terminal aus ausführe, bevor ich dessen Konsole verwende, aber ich möchte dies möglichst automatisch tun.

Ich habe versucht, dem [Service]Abschnitt der Servicedatei eine Regel wie diese hinzuzufügen: ExecStartPost=/bin/chmod 660 /path/to/socket. Das funktioniert jedoch nicht, da es meiner Meinung nach zu einer Verzögerung zwischen dem Starten des Serviceprozesses und dem Erstellen des Sockets kommt. Der ExecStartPostBefehl schlägt dann fehl, was wiederum dazu führt, dass der Dienst beendet wird.

Eine Möglichkeit, dies zu beheben, besteht meiner Meinung nach darin, ein Skript zu schreiben, das wiederholt die Existenz der Datei überprüft und dann die Berechtigungen der Datei ändert, sobald die Datei erkannt wird. Dann könnte ich die Regel in ändern ExecStartPost=/path/to/script. Eine einfachere und möglicherweise weniger robuste Lösung in der gleichen Richtung wäre, die Regel zu ändern ExecStartPost=/bin/bash -c "sleep 5 && /bin/chmod 660 /path/to/socket".

Ist diese Art von Lösung die beste Option oder bietet systemd einen anderen/einfacheren Mechanismus, der für meinen Zweck verwendet werden könnte?

Antwort1

Der grundlegende Leitsatz hierbei ist, dassWas auch immer den Socket bindet, AF_LOCALsollte seine Berechtigungen festlegen. Alles andere wäre eine klapprige Heath-Robinson-Konstruktion.

Wenn das Dæmon-Dienstprogramm den Socket erstellt und bindet, suchen Sie nach Konfigurationsoptionen, mit denen Sie die Berechtigungen des Sockets festlegen können. Leider werden Sie möglicherweise feststellen, dass die Autoren des Programms nicht daran gedacht haben, dass dies erforderlich ist.

Wenn das Dæmon-Dienstprogramm nicht über einen solchen Konfigurationsmechanismus verfügt, versuchen Sie, das Dæmon-Dienstprogrammerhaltensein Kontrollsocket beim Start als bereits geöffneter Dateideskriptor, übergibt Informationen über diesen Dateideskriptor über den LISTEN_FDSMechanismus (da es sich vermutlich um einen Listening-Socket handelt, der Verbindungsanforderungen akzeptiert). Dann ist es die Dienstverwaltung, die für das Erstellen und Binden des Sockets und das Festlegen seiner Berechtigungen verantwortlich ist, was systemdtuthaben Knöpfe für.

Richten Sie dann eine Accept=Nosystemd-Socket-Einheit ein, die diesen Socket beschreibt, einschließlich der entsprechenden ListenStreamEinstellung (da es sich bei der Steuerschnittstelle vermutlich um einen Stream-Socket handelt) und einer SocketMode=0660Einstellung.

verwandte Informationen