el script php no puede acceder a la carpeta / tmp


16

No tengo open_basedir, php puede acceder a / etc / usr / proc / home, etc ... pero no / tmp.

tmpfs es mount on / tmp (/ tmp type tmpfs (rw)) Esa es también la razón por la que quiero usar la carpeta / tmp.

Mis archivos son propiedad de http (usuario para nginx y php) y todos pueden leerlos.

sudo -u http cat /tmp/file funciona pero no funciona nada dentro de un script php (como file_exist () o file ()).

editar: el error se muestra en el registro:

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: probé el problema de otra manera. hice

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

y file_exist devuelve true para que se cree el archivo. Luego vi dentro / tmp y no se puede encontrar ningún archivo "boo" allí. Eso es lo que tenía miedo, php no «ve» el punto de montaje. ¿Por qué es eso y cómo puedo solucionarlo?


¿Cuál es el error devuelto por esas funciones PHP? ¿Qué muestra el registro de errores de PHP?
Tero Kilkanen


¿Existe este archivo /tmp/ydlw/piden /tmp? Si no, entonces esa es la razón del mensaje de error.
Tero Kilkanen

-rw-r - r-- 1 http http 343 23 de julio. 10:12 / tmp / ydlw / pid
eephyne

¿Cuál es su distribución de Linux y la versión de PHP y de dónde obtuvo PHP?
Michael Hampton

Respuestas:


31

Descubrí por qué, bueno, alguien me dio una pista global.

No es culpa de php o tmpfs. El culpable era systemd y su sistema de seguridad PrivateTmp.

Para aquellos que tienen el mismo problema que yo, el servicio php (y probablemente algunos otros) tienen la PrivateTmpopción trueen el script systemd ( /usr/lib/systemd/system).

En ese caso, /tmpse crea un nuevo y se aísla del otro. Todos los datos guardados en el interior se eliminan una vez que se detiene el servicio.

Es una medida de seguridad ya que /tmppuede contener mucha información confidencial y el script php no siempre es seguro.

Para desactivar esto, simplemente copie el script dentro /etc/systemd/system(para evitar sobrescribir sus cambios después de una actualización) y configúrelo PrivateTmpen false.

También puede configurar dos o más servicios para compartir el mismo / tmp usando JoinsNamespaceOf.

Para más información> man systemd.exec


44
¡Gracias por eso! Pasé todo el día tratando de resolver eso. Mi cerebro se está derritiendo por mi nariz por tratar de resolverlo.
Marcelo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.