我正在将我的网络应用程序从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吗?或者有更好的方法来做我需要做的事情吗?是的,我可以使用广泛的权限创建我自己的特殊位置,但似乎只使用普通的临时目录应该更清晰。
答案 0 :(得分:1)
我看到它的方式,只有两个选择:
请勿使用/tmp
,而是使用其他目录,而不是您在应用程序的配置文件中预定义的目录。我最近做了类似的事情,我使用/var/run/myapplication
目录而不是/tmp
。 (我不得不添加一个cron作业来清理它。)
在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
它的作用:
pgrep apache2 -o
/proc/PID/mountinfo
文件,该文件包含此过程中看到的安装信息grep
提取带有正则表达式的私人tmp文件夹如果命名不同,则可能是将来的系统版本或不同的设置需要调整正则表达式。您也可以只使用' /tmp[^ ]+(?= /tmp)'
作为正则表达式。
请注意,这可能对您了解路径没有太大帮助。私有临时文件夹具有严格的权限,仅允许root用户访问。
答案 2 :(得分:0)
我遇到了同样的问题(在CentOS上)并通过以下步骤进行修复。
nano /usr/lib/systemd/system/httpd.service
查看文件和
PrivateTmp=false
至PrivateTmp=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"