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?

eephyne
fuente
¿Cuál es el error devuelto por esas funciones PHP? ¿Qué muestra el registro de errores de PHP?
Tero Kilkanen
Agregué el
¿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

eephyne
fuente
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