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-UO oiem/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?
:
Bearbeitet durch User
Tim T. schrieb: > Anderen Pfad als /tmp verwenden und diese Directory im Apache > freigeben naheliegend.
Rbx schrieb: > Tim T. schrieb: >> Anderen Pfad als /tmp verwenden und diese Directory im Apache >> freigeben > > naheliegend. Das ist nur wieder eine "Lösung" für das aktuelle Problem und löst nicht die Problematik des übergeordneten Zugriffs auf die Informationen in den Sandboxen.
Tim T. schrieb: > Das Programm als Service laufen lassen und über JoinsNamespaceOf in den > Namespace von Apache zu bringe Alternative: nsenter
Tim T. schrieb: > Das ist nur wieder eine "Lösung" für das aktuelle Problem und löst nicht > die Problematik des übergeordneten Zugriffs auf die Informationen in den > Sandboxen. Könnte man was onthefly machen? Also Ramdisk oder Ordner erstellen z.B.
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.
:
Bearbeitet durch User
Das cgi script ermittelt den aktuellen vollen pfad und schreibt ihn in eine umgebungsvariable/datei/db/... die dein anderes programm ausliest.
:
Bearbeitet durch User
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-UO oiem/tmp liegt, kann es nicht wissen.
:
Bearbeitet durch User
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.