PHP:获取true / tmp路径的方法?

时间:2017-05-11 14:55:40

标签: php centos7 systemd temporary-files

我正在将我的网络应用程序从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,这会导致PHP函数调用中的/tmp真正为/tmp/systemd-private-6898f2d665d64b998981bc479ddc2306-php-fpm.service-KU8XML/tmp。哎呀!这对于安全性来说很好,但exec()按字面意思使用/tmp路径,因此无法找到file_put_contents()刚刚创建的文件。 PHP函数sys_get_temp_dir()只返回/tmp,我找不到包含该路径的任何环境变量。有没有办法以编程方式获得该路径?或者我需要关闭PrivateTmp吗?或者有更好的方法来做我需要做的事情吗?是的,我可以使用广泛的权限创建我自己的特殊位置,但似乎只使用普通的临时目录应该更清晰。

4 个答案:

答案 0 :(得分:1)

我看到它的方式,只有两个选择:

  1. 请勿使用/tmp,而是使用其他目录,而不是您在应用程序的配置文件中预定义的目录。我最近做了类似的事情,我使用/var/run/myapplication目录而不是/tmp。 (我不得不添加一个cron作业来清理它。)

  2. 在php-frm服务中禁用PrivateTmp。这是实现此目的的一种方式:

    # 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 :(得分:1)

我有一个类似的问题。这是一种通过PrivateTmp(在本例中为apache2)找出systemd服务的“真实”临时路径的方法:

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

它的作用:

  • 搜索最早的apache2进程的进程ID:pgrep apache2 -o
  • 读取/proc/PID/mountinfo文件,该文件包含此过程中看到的安装信息
  • 使用grep提取带有正则表达式的私人tmp文件夹

如果命名不同,则可能是将来的系统版本或不同的设置需要调整正则表达式。您也可以只使用' /tmp[^ ]+(?= /tmp)'作为正则表达式。

请注意,这可能对您了解路径没有太大帮助。私有临时文件夹具有严格的权限,仅允许root用户访问。

答案 2 :(得分:0)

我遇到了同样的问题(在CentOS上)并通过以下步骤进行修复。

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

查看文件和 PrivateTmp=falsePrivateTmp=true

systemctl daemon-reload
service http restart

你准备好了吗

答案 3 :(得分:0)

Aleks G是正确的方法,但是如果您仍然遇到麻烦,请尝试此方法。

我已经尝试了“ multi-user.target.wants”解决方案,该解决方案有效,但是在重新启动之后,但是在某些时候,PrivateTmp恢复为true。 就像我对Apache2的主要使用是PHP一样,我终于编辑了php.ini,并且取消了sys_temp_dir行的注释。

默认情况下,系统使用由函数sys_get_temp_dir分配的temp dir。函数sys_get_temp_dir将返回“ / tmp”,但事实是您的tmp文件存储在/tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*这样的路径下。所以,对我来说工作是:

编辑php.ini(路径可以在PHP版本之间更改)

sudo nano /etc/php/7.2/cli/php.ini

然后取消注释sys_temp_dir行

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"