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