Discussion:
File Upload mit systemd private temp
(zu alt für eine Antwort)
Jan Novak
2018-05-08 07:24:46 UTC
Permalink
Hallo,

ich baue gerade an einer upload Funktion. System ist ein 9.2 Debian.

File Uploads landen in
/tmp/systemd-private-1b5621511e5e4505814fd887261174e7-apache2.service-iNOxtK/tmp

Leider zeigt der aber
$_FILES["tmp_name"] auf /tmp/phpwPsrev

wo das File nicht liegt.
Wie komme ich an mein File im temp systemd Verzeichnis?

Jan
Christoph M. Becker
2018-05-08 10:21:23 UTC
Permalink
Post by Jan Novak
ich baue gerade an einer upload Funktion. System ist ein 9.2 Debian.
File Uploads landen in
/tmp/systemd-private-1b5621511e5e4505814fd887261174e7-apache2.service-iNOxtK/tmp
Leider zeigt der aber
$_FILES["tmp_name"] auf /tmp/phpwPsrev
wo das File nicht liegt.
Wie komme ich an mein File im temp systemd Verzeichnis?
Grundsätzlich sollte man auf gerade hoch geladene Dateien nicht direkt
zugreifen, sondern immer nur per move_uploaded_file()[1] (oder
is_uploaded_file()). Im PHP-Handbuch wird auch ein move_uploaded_file()
Beispiel gezeigt. Wenn das bei dir nicht funktioniert, dann schau mal
nach upload_tmp_dir[2].

[1] <http://www.php.net/manual/de/function.move-uploaded-file.php>
[2] <http://www.php.net/manual/de/ini.core.php#ini.upload-tmp-dir>
--
Christoph M. Becker
Jan Novak
2018-05-08 10:45:55 UTC
Permalink
Hallo,
Post by Christoph M. Becker
Post by Jan Novak
ich baue gerade an einer upload Funktion. System ist ein 9.2 Debian.
File Uploads landen in
/tmp/systemd-private-1b5621511e5e4505814fd887261174e7-apache2.service-iNOxtK/tmp
Leider zeigt der aber
$_FILES["tmp_name"] auf /tmp/phpwPsrev
wo das File nicht liegt.
Wie komme ich an mein File im temp systemd Verzeichnis?
Grundsätzlich sollte man auf gerade hoch geladene Dateien nicht direkt
zugreifen, sondern immer nur per move_uploaded_file()[1] (oder
is_uploaded_file()). Im PHP-Handbuch wird auch ein move_uploaded_file()
Beispiel gezeigt. Wenn das bei dir nicht funktioniert, dann schau mal
nach upload_tmp_dir[2].
[1] <http://www.php.net/manual/de/function.move-uploaded-file.php>
Ich nutze natürlich die move_uploaded_file Funktion.
Laut PHP Doku [1] :

$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = basename($_FILES["pictures"]["name"][$key]);
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}

Und hier liegt das Problem:
in $_FILES["pictures"]["tmp_name"] (um in obigem Beispiel zu bleiben)
steht nicht der richtige temp Pfad, somit kann er die Datei nicht
verschieben.
In meinem Fall ist der reale temp Pfad der lange systemd Pfad, aber in
[tmp_name] steht nur der kurze Pfsd, z.B. /tmp/phpwPsrev

EDIT (und Problem gelöst):
Das Problem lag wohl daran, dass ich - zu Testzwecken - die Dateien nach
/tmp kopieren wollte (als Zielverzeichnis). Das scheint nicht zu gehen.
Wenn ich als Zielverzeichnis etwas ausserhalb von /tmp wähle,
funktioniert es.


Jan
Post by Christoph M. Becker
[2] <http://www.php.net/manual/de/ini.core.php#ini.upload-tmp-dir>
Christoph M. Becker
2018-05-08 11:05:25 UTC
Permalink
Post by Jan Novak
Das Problem lag wohl daran, dass ich - zu Testzwecken - die Dateien nach
/tmp kopieren wollte (als Zielverzeichnis). Das scheint nicht zu gehen.
Wenn ich als Zielverzeichnis etwas ausserhalb von /tmp wähle,
funktioniert es.
Das liegt vermutlich an der open_basedir Einstellung, siehe
<http://www.php.net/manual/de/function.move-uploaded-file.php#refsect1-function.move-uploaded-file-notes>.
--
Christoph M. Becker
Peter J. Holzer
2018-05-10 08:19:31 UTC
Permalink
Post by Christoph M. Becker
Post by Jan Novak
Das Problem lag wohl daran, dass ich - zu Testzwecken - die Dateien nach
/tmp kopieren wollte (als Zielverzeichnis). Das scheint nicht zu gehen.
Wenn ich als Zielverzeichnis etwas ausserhalb von /tmp wähle,
funktioniert es.
Das liegt vermutlich an der open_basedir Einstellung, siehe
<http://www.php.net/manual/de/function.move-uploaded-file.php#refsect1-function.move-uploaded-file-notes>.
Nein, das liegt wahrscheinlich daran, dass auf neueren Debian-Systemen
der Apache mit einem privaten /tmp gestartet wird:

% grep Private /lib/systemd/system/apache2.service
PrivateTmp=true

Das Directory, das die Apache-Prozesse unter /tmp sehen, ist also nicht
das selbe, das der Rest des Systems unter /tmp sieht.

hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | ***@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel
Jan Novak
2018-05-10 08:46:45 UTC
Permalink
Post by Peter J. Holzer
Post by Christoph M. Becker
Post by Jan Novak
Das Problem lag wohl daran, dass ich - zu Testzwecken - die Dateien nach
/tmp kopieren wollte (als Zielverzeichnis). Das scheint nicht zu gehen.
Wenn ich als Zielverzeichnis etwas ausserhalb von /tmp wähle,
funktioniert es.
Das liegt vermutlich an der open_basedir Einstellung, siehe
<http://www.php.net/manual/de/function.move-uploaded-file.php#refsect1-function.move-uploaded-file-notes>.
Nein, das liegt wahrscheinlich daran, dass auf neueren Debian-Systemen
% grep Private /lib/systemd/system/apache2.service
PrivateTmp=true
Das Directory, das die Apache-Prozesse unter /tmp sehen, ist also nicht
das selbe, das der Rest des Systems unter /tmp sieht.
Ja, genau so ist es!


Jan
Thomas 'PointedEars' Lahn
2018-05-19 18:22:08 UTC
Permalink
Post by Peter J. Holzer
% grep Private /lib/systemd/system/apache2.service
PrivateTmp=true
Das Directory, das die Apache-Prozesse unter /tmp sehen, ist also nicht
das selbe, das der Rest des Systems unter /tmp sieht.
Autsch! Systemd ist/hat einfach ein völlig krankes "Konzept".
--
PointedEars
Zend Certified PHP Engineer <http://www.zend.com/en/yellow-pages/ZEND024953>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.
Arno Welzel
2018-05-23 20:01:40 UTC
Permalink
Post by Thomas 'PointedEars' Lahn
Post by Peter J. Holzer
% grep Private /lib/systemd/system/apache2.service
PrivateTmp=true
Das Directory, das die Apache-Prozesse unter /tmp sehen, ist also nicht
das selbe, das der Rest des Systems unter /tmp sieht.
Autsch! Systemd ist/hat einfach ein völlig krankes "Konzept".
Dass /tmp ein global für alle Prozesse identisches Verzeichnis ist,
halte ich nicht für wesentlich sinnvoller. Eigentlich sollte sowieso
jeder Prozess ein lokales Verzeichnis für diesen Zweck haben.
--
Arno Welzel
https://arnowelzel.de
https://de-rec-fahrrad.de
http://fahrradzukunft.de
Markus Grob
2018-06-11 15:54:33 UTC
Permalink
Post by Arno Welzel
Dass /tmp ein global für alle Prozesse identisches Verzeichnis ist,
halte ich nicht für wesentlich sinnvoller. Eigentlich sollte sowieso
jeder Prozess ein lokales Verzeichnis für diesen Zweck haben.
Bin ich nicht dafür. Vor allem da "kein" Programm aufräumt, ist es
sinnvoller, alles "global" zu haben. Kann ja jeder sein eigenes
Unterverzeichnis nehmen. Wenn ich aufräumen will, brauche ich aber nur
an einem Ort zu schauen. Sonst wächst überall der Datenmüll.
Manche machen daher /tmp nur noch als ramdrive, doch dies halte ich auch
wieder für übertrieben.

Gruss, Markus
Claus Reibenstein
2018-06-11 17:16:53 UTC
Permalink
Post by Markus Grob
Manche machen daher /tmp nur noch als ramdrive, doch dies halte ich auch
wieder für übertrieben.
Kommt drauf an. Wenn genügend RAM verfügbar ist, spricht eigentlich
nichts gegen eine RAM-Disk, aber vieles dafür:

- Sie ist deutlich schneller als eine SSD oder gar eine HD.
- Sie schont die Datenträger.
- Sie erspart das lästige Aufräumen.

Mein Rechner hat 32 GB RAM. Davon habe ich 10 GB für die RAM-Disk
abgezwackt. Bleiben immer noch 22 GB übrig. Reicht auch für aktuelle
Spiele locker aus.

Gruß
Claus
Peter J. Holzer
2018-06-11 17:35:46 UTC
Permalink
Post by Claus Reibenstein
Post by Markus Grob
Manche machen daher /tmp nur noch als ramdrive, doch dies halte ich auch
wieder für übertrieben.
Kommt drauf an. Wenn genügend RAM verfügbar ist, spricht eigentlich
- Sie ist deutlich schneller als eine SSD oder gar eine HD.
- Sie schont die Datenträger.
- Sie erspart das lästige Aufräumen.
Mein Rechner hat 32 GB RAM. Davon habe ich 10 GB für die RAM-Disk
abgezwackt. Bleiben immer noch 22 GB übrig.
Im Normalfall noch viel mehr. tmpfs[1] wächst bei Bedarf bis zur
konfigurierten Maximalgröße und schrumpft auch wieder. Sofern Du da
nicht wirklich 10 GB an Daten drauf hast, braucht Deine RAM-Disk nicht
wirklich 10 GB RAM. Default für tmpfs ist übrigens der halbe
Hauptspeicher.

hp

[1] Ich nehme jetzt ganz frech an, dass Du Linux verwendest.
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | ***@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel
Claus Reibenstein
2018-06-11 18:23:40 UTC
Permalink
Post by Peter J. Holzer
Post by Claus Reibenstein
Mein Rechner hat 32 GB RAM. Davon habe ich 10 GB für die RAM-Disk
abgezwackt. Bleiben immer noch 22 GB übrig.
Im Normalfall noch viel mehr. tmpfs[1] wächst bei Bedarf bis zur
konfigurierten Maximalgröße und schrumpft auch wieder.
Leider habe ich kein tmpfs, sondern die SoftPerfect RAM Disk in der
Version 3.4.8 (die letzte Freeware-Version). Die belegt konstant die 10
GB, was ich aber durchaus verschmerzen kann.

Wenn Du eine dynamische RAM-Disk für Windoof kennst, lass es mich wissen.
Post by Peter J. Holzer
[1] Ich nehme jetzt ganz frech an, dass Du Linux verwendest.
Nur als Gastsysteme unter VirtualBox, da ich aus beruflichen Gründen
noch auf Windows als Hostsystem angewiesen bin. Und dann sind da auch
noch die vielen Spiele ...

Aber in 2½ Jahren gehe ich ja in Rente, und dann wird sowieso alles ganz
anders ;-)

Gruß
Claus
Arno Welzel
2018-06-14 00:40:04 UTC
Permalink
Post by Markus Grob
Post by Arno Welzel
Dass /tmp ein global für alle Prozesse identisches Verzeichnis ist,
halte ich nicht für wesentlich sinnvoller. Eigentlich sollte sowieso
jeder Prozess ein lokales Verzeichnis für diesen Zweck haben.
Bin ich nicht dafür. Vor allem da "kein" Programm aufräumt, ist es
sinnvoller, alles "global" zu haben. Kann ja jeder sein eigenes
Unterverzeichnis nehmen. Wenn ich aufräumen will, brauche ich aber nur
Ja, von mir aus ein Unterverzeichnis in /tmp. Mir ging es darum, dass
nicht jedes Programm in das *selbe* Verzeichnis schreibt und
insbesondere auch aus diesem Verzeichnis alles *lesen* darf.
--
Arno Welzel
https://arnowelzel.de
https://de-rec-fahrrad.de
http://fahrradzukunft.de
Markus Grob
2018-06-14 21:33:34 UTC
Permalink
Post by Arno Welzel
Ja, von mir aus ein Unterverzeichnis in /tmp. Mir ging es darum, dass
nicht jedes Programm in das *selbe* Verzeichnis schreibt und
insbesondere auch aus diesem Verzeichnis alles *lesen* darf.
Klar, doch dafür gibt es ja unterdessen ganz viele komplizierte
Rechtesysteme, damit man sich nicht mehr mit diesen einfachen Sachen wie
Gruppenberechtigung rumschlagen muss, welche dieses Problem meiner
Meinung nach sauber lösen würden ;-)

Gruss, Markus

Loading...