lo script php non può accedere alla cartella / tmp


16

Non ho open_basedir, php può accedere a / etc / usr / proc / home etc ... ma non / tmp.

tmpfs è mount su / tmp (/ tmp type tmpfs (rw)) Questo è anche il motivo per cui voglio usare la cartella / tmp.

I miei file sono di proprietà di http (utente per nginx e php) e leggibili da tutti.

sudo -u http cat /tmp/file funziona ma qualsiasi cosa all'interno di uno script php non funziona (come file_exist () o file ()).

modifica: l'errore mostra nel 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: ho provato il problema nell'altro modo. ho fatto

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

e file_exist restituiscono true in modo da creare il file. Poi ho guardato dentro / tmp e qui non è stato trovato nessun file "boo". Questo è ciò di cui avevo paura, php non «vede» il punto di mount. Perché è così e come posso ripararlo?


Qual è l'errore restituito da queste funzioni PHP? Cosa mostra il registro errori PHP?
Tero Kilkanen,

Ho aggiunto il registro degli errori
eephyne il

Questo file /tmp/ydlw/pidesiste in /tmp? In caso contrario, questo è il motivo del messaggio di errore.
Tero Kilkanen,

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

Qual è la tua distribuzione Linux e la versione di PHP e da dove hai preso PHP?
Michael Hampton

Risposte:


31

Ho scoperto perché, beh, qualcuno mi ha dato il suggerimento globale.

Non è né colpa di php o tmpfs. Il colpevole era sistemato e il suo sistema di sicurezza PrivateTmp.

Per coloro che hanno lo stesso problema che ho riscontrato, il servizio php (e probabilmente alcuni altri) ha l' PrivateTmpopzione di truenello script systemd ( /usr/lib/systemd/system).

In tal caso, un nuovo /tmpviene creato e isolato dall'altro. Tutti i dati salvati all'interno vengono eliminati una volta arrestato il servizio.

È una misura di sicurezza poiché /tmppuò contenere molte informazioni sensibili e gli script php non sono sempre sicuri.

Per disattivarlo, è sufficiente copiare lo script all'interno /etc/systemd/system(per evitare la sovrascrittura delle modifiche dopo un aggiornamento) e impostare PrivateTmpsu false.

Puoi anche impostare due o più servizi per condividere lo stesso / tmp usando JoinsNamespaceOf.

Per maggiori informazioni> man systemd.exec


4
Grazie per questo! Ho trascorso l'intera giornata cercando di capirlo. Il mio cervello si sta sciogliendo il naso per aver cercato così duramente di capirlo.
Marcelo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.