Zugriff auf systemd private tmp

Gast #7771660
Lesenswert?

Hallo,

ich habe ein Problem beim Zugriff auf das private tmp Verzeichnis eines von Systemd gestarteten Prozess, in meinem Fall der Apache.

Kurz zum Setup:

Ein Programm legt in unterschiedlichen Intervallen eine Datei im /tmp Verzeichnis an. Ein cgi-bin Skript liest diese Datei und gibt Informationen aus.

Das Problem hierbei ist, das /tmp Verzeichnis vom cgi-bin Skript ist nicht das System /tmp sondern eine Sandbox im Namespace des Apache, in meinem Fall z.B. gerade jetzt /tmp/systemd-private-827e6bef8aa646c894eb69b1796ebad1-apache2.service-UOoiem/tmp, was sich aber bei jedem Start ändert.

Wenn ich jetzt die Datei von Programm aus schreiben will, muss ich also den Pfad zur Apache2 tmp Sandbox ermitteln, habe damit aber meine Probleme:

Der erste 'Unique'-Teil (827e6bef8aa646c894eb69b1796ebad1) ist die Boot ID, die ich einfach über /proc/sys/kernel/random/boot_id bekomen kann. Der zweite 'Unique'-Teil (UOoiem) wird aber wirklich bei jedem Dienststart gewürfelt und ist offensichtlich nicht so einfach zu ermitteln.

Bis jetzt habe ich als einzige Möglichkeit gefunden die MainPID vom Apache über pid=$(systemctl show --property=MainPID --value apache2.service) zu ermitteln. Und anschließend mittels cat /proc/$pid/mountinfo | grep ' /tmp ' mir die Information über den Pfad geben zu lassen und anschließend den String zurecht zu schnibbeln. Aber da muss es doch eine einfachere Möglichkeit zu geben.

Also was ich suche, ist eine einfache Möglichkeit den Pfad der tmp Sandbox eines Systemd Service zu ermitteln.

Es gibt natürlich einige Möglichkeiten um dieses Problem herum zu kommen, welche aber alle aus diversen Gründen nicht gewollt sind:

  • Abschalten der PrivateTmp im Systemd File von Apache und wieder alles in /tmp
  • Anderen Pfad als /tmp verwenden und diese Directory im Apache freigeben
  • Datenbank für die Informationen verwenden
  • Das Programm als Service laufen lassen und über JoinsNamespaceOf in den Namespace von Apache zu bringen (wobei diese Option, wenn das Prgramm kein Service sein müsste eine mögliche Option wäre)
  • Das Programm direkt über cgi-bin starten

Hat Jemand eventuell eine Idee hierzu?

Gast #7771687
Lesenswert?

Mario M. schrieb:

Tim T. schrieb:

Das Programm als Service laufen lassen und über JoinsNamespaceOf in den Namespace von Apache zu bringe

Alternative: nsenter

Hatte ich auch schon überlegt, aber damit komme ich ja nur in die Sandbox aber nicht an den Namen des Pfades dahin. Oder wie würdest du mit nsenter eine Datei in die Sandbox bekommen?

EDIT: Ok, es funktioniert mit 'nsenter -t $pid -m programm'.

EDIT2: Zwar bekomme ich damit immer noch nicht den Pfad, aber das Programm läuft zumindest im gleichen Namespace und ich kann über /tmp die Datei an die richtige Stelle legen.

Gast #7771714
Lesenswert?

Franko S. schrieb:

Das cgi script ermittelt den aktuellen vollen pfad und schreibt ihn in eine umgebungsvariable/datei/db/... die dein anderes programm ausliest.

Kann das cgi script aber nicht, da es in der Sandbox läuft und von der Welt drumherum keine Ahnung hat.

Für das cgi script existiert nur /tmp, das es unter /tmp/systemd-private-827e6bef8aa646c894eb69b1796ebad1-apache2.service-UOoiem/tmp liegt, kann es nicht wissen.

Gast #7772143
Lesenswert?

Ja stimmt die Sandbox habe ich überlesen. Dann legt eben dein CGI script, ne Datei mit einem eindeutigen Namen an nach dem dein Programm unter /tmp sucht. Das ist irgendwie alles Gemurkse aber anders geht halt nicht wenn zwei Programme abgeschottet sein sollen aber doch Daten austauschen sollen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren