为什么php看不到/tmp文件

Asa*_*vic 7 php systemd tmp files sandbox

我有简单的 test.php 页面:

<pre><?php system("ls -la /tmp"); ?></pre>
Run Code Online (Sandbox Code Playgroud)

它总是只显示:...文件夹,浏览器中没有其他内容。

在命令行中:

1) ls -la /tmp
2) sudo -u http ls -la /tmp
3) php test.php
4) sudo -u http php test.php
Run Code Online (Sandbox Code Playgroud)

所有这些命令都返回目录文件/子目录的完整列表。

这是什么原因???

问题与“/tmp”文件夹相关,因为ls -lah /usr工作正常。

我在 4 个 comps 上对此进行了测试(其中一个是带有 php 5.0.6 的 debian,并且 php 像我预期的那样显示所有文件,其他 3 个 comps 有 php7 并显示空的 /tmp)。

更新:

即使在将 http 添加到 sudoers 文件并运行 'sudo ls /tmp' 之后,问题在 php 版本 >7 上也是一样的。

但是乳宁“系统( “回声AAA> /tmp/aaa.txt; LS -la / TMP”)所示...aaa.txt文件通过HTTP所属:HTTP。所以这是一些新的 php 限制,以及如何仅干扰 /tmp 文件。

更新2:

但是 aaa.txt 不在 /tmp 里面,通过运行find /tmp -name aaa.txt,我看到它在里面/tmp/systemd-private-2cf1853410ad4ade980ec17e883771c3-httpd.service-lZ22gS/tmp/aaa.txt

所以最后它与称为“ systemd / tmp 隔离”的东西有关......我需要了解它。

truefalse里面/etc/systemd/system/multi-user.target.wants/httpd.service::

[Service]
PrivateTmp=false
...
Run Code Online (Sandbox Code Playgroud)

解决了我的问题,但我想知道是否可以在不更改服务文件的情况下避免这种情况。

小智 5

我运行的是 Ubuntu 18.04,/usr/lib/systemd 不包含任何 http 或 apache2 服务。但是,我执行了以下命令:

sudo find / -mount -type f -exec grep -e "PrivateTmp" '{}' ';' -print
Run Code Online (Sandbox Code Playgroud)

并在/lib/systemd/apache2.service中找到PrivateTmp =true。将true改为false并执行

systemctl daemon-restart
systemctl restart apache2
Run Code Online (Sandbox Code Playgroud)

解决了问题。

  • 我认为您不应该更改 /lib 中的那个,因为它是由包管理的;相反,将其复制到 /etc 并在那里进行修改。 (2认同)

the*_*fog 1

<pre><?php system("ls -la /tmp"); ?></pre>
..
总是显示: . 和..文件夹,浏览器中没有其他内容。..
这是什么原因???

这就是该函数的全部system()设计目的 - 它只返回 shell 命令的最后一行输出。
那么为什么存在一个命令只提供一行无用的输出呢?可能是因为system()允许您捕获 shell 进程的退出代码(如果您$return_var作为第二个参数传递),而shell_exec- 它确实为您提供了所有 shell 输出, 但不提供退出代码!

因此,如果您想要所有输出和退出代码,您可以使用exec(),但是exec很麻烦,因为完整的输出只能通过引用数组获得$output,然后您必须循环访问才能查看输出。

另外,当您在玩 时/tmp,您应该知道用于systemd管理 php-fpm 守护进程的 PHP-FPM 的新版本将传递一个设置,该设置阻止 php 文件的执行,以免耗尽 tmp。
我的笔记本电脑上运行着 php 7.0.1,但后来我安装了7.1.1并发现它们现在嵌入了这个小指令

PrivateTmp=true
Run Code Online (Sandbox Code Playgroud)

在systemd服务文件中。如果您想运行 php 脚本以获取有关/tmp
该特定问题的更多背景信息,则需要将其设置为 false
https://serverfault.com/questions/614781/php-script-cant-access-tmp-folder