PHP скрипт не может получить доступ к папке / tmp

16

У меня нет open_basedir, php может получить доступ к / etc / usr / proc / home и т. Д., Но не к / tmp.

tmpfs монтируется в / tmp (/ tmp type 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 возвращает true, поэтому файл создается. Затем я посмотрел внутри / tmp, и там нет файла "boo". Вот чего я боялся, php не «видит» точку монтирования. Почему это и как я могу это исправить?

eephyne
источник
Какая ошибка возвращается этими функциями PHP? Что показывает журнал ошибок PHP?
Теро Килканен
Я добавил журнал ошибок
eephyne
Существует ли этот файл /tmp/ydlw/pidв /tmp? Если нет, то это причина сообщения об ошибке.
Теро Килканен
-rw-r - r-- 1 http http 343 23 июл. 10:12 / tmp / ydlw / pid
eephyne
Какой у вас дистрибутив Linux и версия PHP и откуда вы взяли PHP?
Майкл Хэмптон

Ответы:

31

Я выяснил, почему, ну, кто-то дал мне глобальный намек.

Это не вина php или tmpfs. Виновником был системный и его система безопасности PrivateTmp.

Для тех, кто попадает в ту же проблему, что и я, сервис php (и, возможно, некоторые другие) имеют PrivateTmpвозможность trueв сценарии systemd ( /usr/lib/systemd/system).

В этом случае новое /tmpсоздается и изолируется от другого. Все данные, сохраненные внутри, удаляются после остановки службы.

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

Чтобы отключить это, просто скопируйте скрипт внутри /etc/systemd/system(чтобы избежать перезаписи изменений после обновления) и установите PrivateTmpв false.

Вы также можете установить две или более служб для использования одного и того же / tmp JoinsNamespaceOf.

Для получения дополнительной информации> man systemd.exec

eephyne
источник
4
Спасибо вам за это! Я провел весь день, пытаясь понять это. Мой мозг тает от моего носа за то, что я так старался понять это.
Марсело