php скрипт не може отримати доступ до папки / tmp


16

У мене немає open_basedir, php може отримати доступ / etc / usr / proc / home тощо ... але не / tmp.

tmpfs встановлено на / tmp (/ тип tmp tmpfs (rw)) Це також причина, коли я хочу використовувати папку / tmp.

Мої файли належать http (користувач для nginx та php) та читаються всіма.

sudo -u http cat /tmp/file працює, але все, що знаходиться всередині скрипта php, не робить (як file_exist () або file ()).

редагувати: помилка відображається в журналі:

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: Я перевірив проблему іншим способом. я зробив

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

і file_exist повертає правду, тому файл створюється. Потім я переглянув всередині / tmp і жодного файлу "boo" там не можна знайти. Ось чого я боявся, php не «бачить» точку монтування. Чому це і як я можу це виправити?


Яка помилка повертається тими функціями PHP? Що показує журнал помилок PHP?
Tero Kilkanen

Я додав журнал помилок
eephyne

Чи /tmp/ydlw/pidіснує цей файл у /tmp? Якщо ні, то це причина повідомлення про помилку.
Tero Kilkanen

-rw-r - r-- 1 http http 343 23 липня. 10:12 / tmp / ydlw / pid
eephyne

Яка ваша дистрибутива Linux та версія PHP і звідки ви взяли PHP?
Майкл Хемптон

Відповіді:


31

Я з’ясував, чому, ну, хтось дав мені глобальну підказку.

Це не є виною ні php, ні tmpfs. Винуватець був систематизований та його система безпеки PrivateTmp.

Для тих, хто потрапляє в той самий випуск, що і я, сервіс php (і, можливо, деякі інші) має PrivateTmpможливість trueв системному скрипті ( /usr/lib/systemd/system).

У цьому випадку створюється нове /tmpта виділяється від іншого. Усі дані, що зберігаються всередині, видаляються після припинення послуги.

Це захід безпеки, оскільки /tmpможе містити багато конфіденційної інформації, а php-скрипт не завжди захищений.

Щоб вимкнути це, просто скопіюйте скрипт всередину /etc/systemd/system(щоб уникнути перезапису змін після оновлення) та встановіть PrivateTmpна false.

Ви також можете встановити дві або більше служб для спільного використання того ж / tmp, використовуючи JoinsNamespaceOf.

Для отримання додаткової інформації> man systemd.exec


4
Дякую тобі за це! Я провів цілий день, намагаючись зрозуміти це. Мій мозок плавиться від мого носа за те, що я намагаюся так зрозуміти.
Марсело
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.