centos7 — PHP: способ получить истинный путь / TMP?

Я перевожу свое веб-приложение с 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? Или есть лучший способ сделать то, что мне нужно сделать? Да, я мог бы создать свое собственное специальное место с широко открытыми разрешениями, но кажется, что было бы лучше использовать обычный временный каталог.

1

Решение

На мой взгляд, есть только два варианта:

  1. Не использовать /tmp но вместо этого другой каталог, который вы предопределяете в файле конфигурации вашего приложения. Я сделал нечто подобное недавно, где я использовал /var/run/myapplication каталог вместо /tmp, (Я должен был добавить работу cron, чтобы очистить это также.)

  2. запрещать 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
    
1

Другие решения

У меня просто была похожая проблема. Это способ узнать «реальный» временный путь службы systemd с помощью PrivateTmp (в данном случае apache2):

 grep -oP ' /tmp/systemd-private-[^/]+-apache2[^/]+/tmp(?= /tmp)' /proc/`pgrep apache2 -o`/mountinfo

Что оно делает:

  • найдите идентификатор процесса самого старого процесса apache2: pgrep apache2 -o
  • читать /proc/PID/mountinfo файл, который содержит информацию о монтировании, видимую этим процессом
  • распакуйте частную папку tmp с помощью регулярного выражения, используя grep

Может случиться так, что в будущих версиях systemd или других настройках регулярное выражение необходимо будет изменить, если имена будут другими. Вы также можете просто использовать ' /tmp[^ ]+(?= /tmp)' как регулярное выражение

Обратите внимание, что это может не помочь вам узнать путь. Частные временные папки имеют строгие разрешения, которые разрешают только корневой доступ.

1

У меня была та же проблема (на CentOS) и исправить ее с помощью следующих шагов.

nano /usr/lib/systemd/system/httpd.service

Посмотрите в файл и
PrivateTmp=false в PrivateTmp=true

systemctl daemon-reload
service http restart

И ты готов2го

0
По вопросам рекламы [email protected]