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.