PHP-Skript kann nicht auf / tmp Ordner zugreifen

16

Ich habe kein open_basedir, PHP kann auf / etc / usr / proc / home etc ... zugreifen, aber nicht auf / tmp.

tmpfs wird in / tmp eingebunden (tmpfs (rw) vom Typ / tmp). Dies ist auch der Grund, warum ich den Ordner / tmp verwenden möchte.

Meine Dateien gehören http (Benutzer für Nginx und PHP) und können von jedem gelesen werden.

sudo -u http cat /tmp/file funktioniert, aber alles in einem PHP-Skript funktioniert nicht (wie file_exist () oder file ()).

edit: der fehler im log anzeigen:

PHP Warning:  file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267

edit2: Ich habe das Problem anders herum getestet. ich machte

touch("/tmp/boo");
file_exist("/tmp/boo");

und file_exist geben true zurück, damit die Datei erstellt wird. Dann habe ich in / tmp zugesehen und dort ist keine "boo" -Datei zu finden. Das habe ich befürchtet, php «sieht» den Einhängepunkt nicht. Warum ist das so und wie kann ich das beheben?

Eephyn
quelle
Was ist der Fehler, der von diesen PHP-Funktionen zurückgegeben wird? Was zeigt das PHP-Fehlerprotokoll?
Tero Kilkanen
Ich fügte das Fehlerprotokoll hinzu
Eephyne
Existiert diese Datei /tmp/ydlw/pidin /tmp? Wenn nicht, ist dies der Grund für die Fehlermeldung.
Tero Kilkanen
-rw-r - r-- 1 http http 343 23 juil. 10:12 / tmp / ydlw / pid
eephyne
Was ist Ihre Linux-Distribution und PHP-Version und woher haben Sie PHP?
Michael Hampton

Antworten:

31

Ich fand heraus, warum jemand mir den globalen Hinweis gab.

Es ist weder die Schuld von PHP noch von tmpfs. Der Täter war systemd und sein Sicherheitssystem PrivateTmp.

Für diejenigen, die das gleiche Problem haben wie ich, hat der Dienst php (und wahrscheinlich einige andere) die PrivateTmpMöglichkeit, es trueim systemd script ( /usr/lib/systemd/system) zu tun .

In diesem Fall wird eine neue /tmperstellt und von der anderen isoliert. Alle darin gespeicherten Daten werden gelöscht, sobald der Dienst beendet wird.

Es ist eine Sicherheitsmaßnahme, da /tmpsehr viele sensible Informationen enthalten können und PHP-Skripte nicht immer sicher sind.

Um dies zu deaktivieren, kopieren Sie einfach das Skript hinein /etc/systemd/system(um ein Überschreiben Ihrer Änderungen nach einem Update zu vermeiden) und setzen Sie es PrivateTmpauf false.

Sie können auch zwei oder mehr Dienste so einstellen, dass sie dasselbe / tmp verwenden JoinsNamespaceOf.

Weitere Informationen> man systemd.exec

Eephyn
quelle
4
Danke für das! Ich habe den ganzen Tag versucht, das herauszufinden. Mein Gehirn schmilzt mir die Nase, weil ich mich so sehr bemüht habe, das herauszufinden.
Marcelo