为什么php看不到/tmp文件

为什么php看不到/tmp文件

我有简单的 test.php 页面:

<pre><?php system("ls -la /tmp"); ?></pre>

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

在命令行中:

1) ls -la /tmp
2) sudo -u http ls -la /tmp
3) php test.php
4) sudo -u http php test.php

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

这是什么原因???

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

我在 4 个组件上测试了这个(其中一个是带有 php 5.0.6 的 debian,并且 php 显示所有文件都正常,就像我预期的那样,其他 3 个组件有 php7 并显示空 /tmp)。

更新:

即使将 http 添加到 sudoers 文件并运行“sudo ls /tmp”后,问题在 php 版本 > 7 上仍然相同。

但运行 'system("echo aaa > /tmp/aaa.txt; ls -la /tmp") 显示...aaa.txthttp: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
...

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

答案1

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

sudo find / -mount -type f -exec grep -e "PrivateTmp" '{}' ';' -print

并发现于/lib/systemd/apache2.servicePrivateTmp=true。改变真的错误的并执行

systemctl daemon-restart
systemctl restart apache2

解决了问题。

答案2

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

这就是该函数的全部system()设计目的 - 它只返回 shell 命令的最后一行输出。
那么为什么存在一个命令只提供一行无用的输出呢?可能是因为系统()允许您捕获 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

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

相关内容