Forum: PC Hard- und Software Zugriff auf systemd private tmp


von Tim T. (tim_taylor) Benutzerseite


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-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
von Rbx (rcx)


Lesenswert?

Tim T. schrieb:
> Anderen Pfad als /tmp verwenden und diese Directory im Apache
> freigeben

naheliegend.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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.

von Mario M. (thelonging)


Lesenswert?

Tim T. schrieb:
> Das Programm als Service laufen lassen und über JoinsNamespaceOf in den
> Namespace von Apache zu bringe

Alternative: nsenter

von Rbx (rcx)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


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.

: Bearbeitet durch User
von Franko S. (frank_s866)


Lesenswert?

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

: Bearbeitet durch User
von Tim T. (tim_taylor) Benutzerseite


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-UO 
oiem/tmp  liegt, kann es nicht wissen.

: Bearbeitet durch User
von Franko S. (frank_s866)


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.

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
Noch kein Account? Hier anmelden.