it-swarm.com.de

PHP hat sein eigenes/tmp in/tmp/systemd-private-nABCDE/tmp, wenn über nginx darauf zugegriffen wird

Ich fand ein seltsames Verhalten bezüglich php und /tmp Ordner. PHP verwendet einen anderen Ordner, wenn es mit /tmp arbeitet. Php 5,6,7, nginx, php-fpm. 

Das gleiche Skript kann auf zwei Arten ausgeführt werden: über den Browser und über die Shell. Wenn es jedoch über einen Browser gestartet wird, befindet sich die Datei nicht im richtigen /tmp-Ordner:

<?php
$name = date("His");

echo "File /tmp/$name.txt\n";

Shell_exec('echo "123" > /tmp/'.$name.'.txt');

var_dump(file_exists('/tmp/'.$name.'.txt'));

var_dump(Shell_exec('cat /etc/*release | tail -n 1'));

php -f script.php

File /tmp/185617.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

Wo ist die Datei? In/tmp

$ find / -name 185617.txt
/tmp/185617.txt

Wenn ich über http://myserver.ru/script.php darauf komme, bekomme ich

File /tmp/185212.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

Aber wo ist die Datei? 

$ find / -name 185212.txt
/tmp/systemd-private-nABCDE/tmp/185212.txt

Warum glaubt PHP, dass /tmp in /tmp/systemd-private-nABCDE/tmp sein sollte?

17
shukshin.ivan

Weil systemd so konfiguriert ist, dass nginx ein privates/tmp erhält. Wenn Sie must stattdessen aus irgendeinem Grund das System/tmp verwenden, müssen Sie die .service-Datei ändern, um "PrivateTmp = no" zu lesen.

Wenn Sie mehrere Sites auf dem Server ausführen, sollten Sie PrivateTmp = yes belassen, damit jede Site auch bei der Verwendung von temporären Dateien getrennt bleibt. Könnte sonst ein Sicherheitsproblem sein, würde ich mir vorstellen.

1
Artis

Ignacio Vazquez-Abrams hat die richtige Antwort, aber lassen Sie mich meine funktionale Lösung hinzufügen.

Ich habe versucht "multi-user.target.wants" zu lösen, es hat aber nach dem Neustart geklappt, aber irgendwann wird PrivateTmp wieder auf true zurückgesetzt. Wie meine hauptsächliche Verwendung von Apache2 PHP ist, habe ich endlich die Datei php.ini bearbeitet und die Kommentarzeile sys_temp_dir entfernt.

Standardmäßig wird das von der Funktion sys_get_temp_dir zugewiesene temporäre Verzeichnis verwendet. Die Funktion sys_get_temp_dir gibt "/ tmp" zurück, aber die Wahrheit ist, dass Ihre tmp-Dateien unter einem Pfad wie /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-Apache2.service-YYYYY//tmp/* gespeichert sind. Was für eine Arbeit für mich war:

Edit php.ini (Pfad kann sich zwischen PHP Versionen) ändern)

Sudo nano /etc/php/7.2/cli/php.ini

Dann Kommentarzeile sys_temp_dir entfernen

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"
0
Benjamin