我有简单的 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.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 隔离“……我需要学习。
更改true
为false
内部:/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.service这PrivateTmp=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