le script php ne peut pas accéder au dossier / tmp

16

Je n'ai pas open_basedir, php peut accéder à / etc / usr / proc / home etc… mais pas / tmp.

tmpfs est monté sur / tmp (type / tmp tmpfs (rw)) C'est aussi la raison pour laquelle je veux utiliser le dossier / tmp.

Mes fichiers appartiennent à http (utilisateur pour nginx et php) et sont lisibles par tout le monde.

sudo -u http cat /tmp/file fonctionne mais tout ce qui se trouve dans un script php ne fonctionne pas (comme file_exist () ou file ()).

modifier: l'erreur s'affiche dans le journal:

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: J'ai testé le problème dans l'autre sens. J'ai fait

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

et file_exist renvoie true pour que le fichier soit créé. Ensuite, j'ai regardé dans / tmp et aucun fichier "boo" ne peut être trouvé là-bas. C'est ce que j'avais peur, php ne «voit» pas le point de montage. Pourquoi est-ce et comment puis-je résoudre ce problème?

eephyne
la source
Quelle est l'erreur renvoyée par ces fonctions PHP? Que montre le journal des erreurs PHP?
Tero Kilkanen
J'ai ajouté le journal des erreurs
eephyne
Ce fichier /tmp/ydlw/pidexiste- t- il dans /tmp? Sinon, c'est la raison du message d'erreur.
Tero Kilkanen
-rw-r - r-- 1 http http 343 23 juil. 10:12 / tmp / ydlw / pid
eephyne
Quelle est votre distribution Linux et votre version PHP et d'où avez-vous obtenu PHP?
Michael Hampton

Réponses:

31

J'ai découvert pourquoi, eh bien, quelqu'un m'a donné un indice global.

Ce n'est ni la faute de php ni de tmpfs. Le coupable était systemd et son système de sécurité PrivateTmp.

Pour ceux qui rencontrent le même problème que moi, le service php (et probablement quelques autres) a la PrivateTmppossibilité de le faire truedans le script systemd ( /usr/lib/systemd/system).

Dans ce cas, un nouveau /tmpest créé et isolé de l'autre. Toutes les données enregistrées à l'intérieur sont supprimées une fois le service arrêté.

C'est une mesure de sécurité car /tmppeut contenir beaucoup d'informations sensibles et les scripts php ne sont pas toujours sécurisés.

Pour désactiver cela, copiez simplement le script à l'intérieur /etc/systemd/system(pour éviter d'écraser vos modifications après une mise à jour) et réglez PrivateTmpsur false.

Vous pouvez également définir deux services ou plus pour partager le même / tmp à l'aide JoinsNamespaceOf.

Pour plus d'informations> man systemd.exec

eephyne
la source
4
Merci pour ça! J'ai passé toute la journée à essayer de comprendre cela. Mon cerveau fond sur mon nez pour avoir essayé si fort de comprendre cela.
Marcelo