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

У меня нет 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 не "видит" точку монтирования. Почему это и как я могу это исправить?

1 ответ

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам