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ć?
/tmp/ydlw/pid
istnieje/tmp
? Jeśli nie, to jest to przyczyną komunikatu o błędzie.Odpowiedzi:
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ą
PrivateTmp
opcjętrue
w skrypcie systemd (/usr/lib/systemd/system
).W takim przypadku nowy
/tmp
jest tworzony i izolowany od drugiego. Wszystkie dane zapisane w środku są usuwane po zatrzymaniu usługi.Jest to środek bezpieczeństwa, ponieważ
/tmp
moż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 ustawPrivateTmp
nafalse
.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
źródło