Php 在 /tmp/systemd-private-nABCDE/tmp 中有自己的 /tmp,当通过 nginx 访问时

2022-08-30 16:08:41

我发现奇怪的行为和文件夹。Php 在与 一起使用时使用另一个文件夹。Php 5.6.7, nginx, php-fpm.php/tmp/tmp

我以两种方式执行相同的脚本:通过浏览器和通过shell。但是当它通过浏览器启动时,文件不在实际文件夹中:/tmp

<?php
$name = date("His");

echo "File /tmp/$name.txt\n";

shell_exec('echo "123" > /tmp/'.$name.'.txt');

var_dump(file_exists('/tmp/'.$name.'.txt'));

var_dump(shell_exec('cat /etc/*release | tail -n 1'));

php -f script.php

File /tmp/185617.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

文件在哪里?在 /tmp 中

$ find / -name 185617.txt
/tmp/185617.txt

如果通过我得到访问它http://myserver.ru/script.php

File /tmp/185212.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

但是文件在哪里?

$ find / -name 185212.txt
/tmp/systemd-private-nABCDE/tmp/185212.txt

为什么php认为应该在?/tmp/tmp/systemd-private-nABCDE/tmp


答案 1

因为 systemd 配置为为 nginx 提供私有 /tmp。如果出于某种原因必须使用系统 /tmp,则需要将 .service 文件修改为“PrivateTmp=no”。


答案 2

如果您在服务器上运行多个站点,那么我认为您需要保留PrivateTmp = yes,以便每个站点即使在使用临时文件时也保持隔离。否则,我可能会遇到安全问题。


推荐