Skrypt php nie może uzyskać dostępu do folderu / tmp

16

Nie mam open_basedir, php może uzyskać dostęp do / etc / usr / proc / home etc… ale nie / tmp.

tmpfs jest zamontowany na / tmp (/ tmp typ tmpfs (rw)) To jest również powód, dla którego chcę używać folderu / tmp.

Moje pliki są własnością http (użytkownik dla nginx i php) i są czytelne dla wszystkich.

sudo -u http cat /tmp/file działa, ale nic w skrypcie php nie działa (jak file_exist () lub file ()).

edycja: błąd pokazuje w logu:

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: Testowałem problem w inny sposób. zrobiłem

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

i file_exist zwracają wartość true, aby plik został utworzony. Potem obejrzałem wewnątrz / tmp i nie można tam znaleźć pliku „boo”. Właśnie się bałem, php nie «widzi» punktu montowania. Dlaczego tak jest i jak mogę to naprawić?

eefin
źródło
Jaki błąd zwracają te funkcje PHP? Co pokazuje dziennik błędów PHP?
Tero Kilkanen,
Dodałem dziennik błędów
eephyne
Czy ten plik /tmp/ydlw/pidistnieje /tmp? Jeśli nie, to jest to przyczyną komunikatu o błędzie.
Tero Kilkanen,
-rw-r - r-- 1 http http 343 23 juil. 10:12 / tmp / ydlw / pid
eephyne
Jaka jest Twoja dystrybucja Linuksa i wersja PHP i skąd masz PHP?
Michael Hampton

Odpowiedzi:

31

Dowiedziałem się, dlaczego ktoś dał mi globalną wskazówkę.

To nie jest wina php ani tmpfs. Sprawca był usystematyzowany i jego system bezpieczeństwa PrivateTmp.

Dla tych, którzy mają ten sam problem, co ja, usługa php (i prawdopodobnie niektóre inne) mają PrivateTmpopcję truew skrypcie systemd ( /usr/lib/systemd/system).

W takim przypadku nowy /tmpjest tworzony i izolowany od drugiego. Wszystkie dane zapisane w środku są usuwane po zatrzymaniu usługi.

Jest to środek bezpieczeństwa, ponieważ /tmpmoże zawierać wiele poufnych informacji, a skrypt php nie zawsze jest bezpieczny.

Aby to wyłączyć, po prostu skopiuj skrypt do środka /etc/systemd/system(aby uniknąć zastąpienia zmian po aktualizacji) i ustaw PrivateTmpna false.

Możesz także ustawić dwie lub więcej usług na współdzielenie tego samego / tmp JoinsNamespaceOf.

Aby uzyskać więcej informacji> man systemd.exec

eefin
źródło
4
Dziękuję za to! Cały dzień próbowałem to rozgryźć. Mój mózg topi się z nosa, że ​​tak bardzo staram się to rozgryźć.
Marcelo