Ich verschiebe meine Web-App von CentOS 5 nach CentOS 7, und neue Sicherheitsfunktionen bezüglich des Verzeichnisses/tmp brechen meinen Code. Ich frage mich, wie ich damit umgehen soll.PHP: Weg, um den wahren/tmp Pfad zu bekommen?
Ich habe PHP-Code, der eine LaTeX-Datei erstellt, führt dann Befehle aus, um diese in eine PDF-Datei umzuwandeln, und das dann an den Benutzer mit entsprechenden Kopfzeilen. Hier sind einige der relevanten Codezeilen wie es jetzt steht:
$fileroot = "/tmp/addr".getmypid();
ob_start();
/* echo all the LaTeX stuff */
file_put_contents($fileroot.".tex",ob_get_contents());
ob_end_clean();
exec("cd /tmp;uplatex -interaction=batchmode --output-directory=/tmp $fileroot", $output, $return);
Die Einstellungen in /usr/lib/systemd/system/php-fpm.service umfassen PrivateTmp=true
, die /tmp
innerhalb PHP verursacht Funktion aufruft wirklich sei /tmp/systemd-private-6898f2d665d64b998981bc479ddc2306-php-fpm.service-KU8XML/tmp
. Huch! Das ist gut für die Sicherheit, aber exec() verwendet den Pfad /tmp
wörtlich, so dass es nicht die Datei finden kann, die file_put_contents()
gerade erstellt. Die PHP-Funktion gibt einfach /tmp
zurück, und ich kann keine Umgebungsvariablen mit diesem Pfad in ihnen finden. Gibt es eine Möglichkeit, diesen Pfad programmgesteuert zu erhalten? Oder muss ich PrivateTmp ausschalten? Oder gibt es einen besseren Weg, um das zu tun, was ich tun muss? Ja, ich könnte meinen eigenen speziellen Ort mit weit offenen Berechtigungen erstellen, aber es scheint, als sollte es sauberer sein, nur das normale temporäre Verzeichnis zu verwenden.
Was bedeutet 'realpath ("/ tmp")' zurückkehren? –
Wenn Sie 'sys_get_temp_dir()' verwenden, sollte es den Pfad bekommen, ohne dass Sie sich um die harte Programmierung kümmern müssen: http://php.net/manual/en/function.sys-get-temp-dir.php –
Wenn sie sagen PHP hat eine Funktion für alles, was sie nicht scherzen. – Havenard