Я перевожу свое веб-приложение с CentOS 5 на CentOS 7, и новые функции безопасности, связанные с каталогом / tmp, нарушают мой код. Мне интересно, как лучше с этим справиться.
У меня есть PHP-код, который создает файл LaTeX, затем выполняет команды, чтобы превратить его в PDF, а затем передает его пользователю с соответствующими заголовками. Вот некоторые из соответствующих строк кода в его нынешнем виде:
$fileroot = "/tmp/addr".getmypid();
ob_start();
/* echo all the LaTeX stuff */
file_put_contents($fileroot.".tex",ob_get_contents());
ob_end_clean();
exec("cd /tmp;uplatex -interaction=batchmode --output-directory=/tmp $fileroot", $output, $return);
Настройки в /usr/lib/systemd/system/php-fpm.service включают PrivateTmp=true
, что приводит к /tmp
в вызовах функций PHP, чтобы действительно /tmp/systemd-private-6898f2d665d64b998981bc479ddc2306-php-fpm.service-KU8XML/tmp
, Хлоп! Это нормально для безопасности, но exec () использует /tmp
путь буквально, поэтому он не может найти файл, который file_put_contents()
только что создан. Функция PHP sys_get_temp_dir()
просто возвращается /tmp
, и я не могу найти переменные окружения с этим путем в них. Есть ли способ получить этот путь программно? Или мне нужно отключить PrivateTmp? Или есть лучший способ сделать то, что мне нужно сделать? Да, я мог бы создать свое собственное специальное место с широко открытыми разрешениями, но кажется, что было бы лучше использовать обычный временный каталог.
На мой взгляд, есть только два варианта:
Не использовать /tmp
но вместо этого другой каталог, который вы предопределяете в файле конфигурации вашего приложения. Я сделал нечто подобное недавно, где я использовал /var/run/myapplication
каталог вместо /tmp
, (Я должен был добавить работу cron, чтобы очистить это также.)
запрещать PrivateTmp
в сервисе php-frm. Вот один из способов сделать это:
# mkdir /usr/lib/systemd/system/php-fpm.service.d
# echo -e "[Service]\nPrivateTmp=no" > /etc/systemd/system/php-fpm.service.d/privatetmp.conf
# systemctl daemon-reload
# systemctl restart php-fpm
# systemctl show php-fpm | grep PrivateTmp
PrivateTmp=no
У меня просто была похожая проблема. Это способ узнать «реальный» временный путь службы systemd с помощью PrivateTmp (в данном случае apache2):
grep -oP ' /tmp/systemd-private-[^/]+-apache2[^/]+/tmp(?= /tmp)' /proc/`pgrep apache2 -o`/mountinfo
Что оно делает:
pgrep apache2 -o
/proc/PID/mountinfo
файл, который содержит информацию о монтировании, видимую этим процессомgrep
Может случиться так, что в будущих версиях systemd или других настройках регулярное выражение необходимо будет изменить, если имена будут другими. Вы также можете просто использовать ' /tmp[^ ]+(?= /tmp)'
как регулярное выражение
Обратите внимание, что это может не помочь вам узнать путь. Частные временные папки имеют строгие разрешения, которые разрешают только корневой доступ.
У меня была та же проблема (на CentOS) и исправить ее с помощью следующих шагов.
nano /usr/lib/systemd/system/httpd.service
Посмотрите в файл и
PrivateTmp=false
в PrivateTmp=true
systemctl daemon-reload
service http restart
И ты готов2го