我的网站是关于复制文件的。我决定使用overlayfs,而不是复制文件以避免过多的时间和服务器滞后。使用 PHP 解释器将文件夹编码mount
到终端中指定的位置。但是,当我从 Apache 运行 php 脚本时,脚本不会mount
覆盖。最糟糕的是没有错误输出,所以我可以调试出了什么问题。我检查了 php 错误日志,没有关于发生的事情的输出。
我安装overlayfs的目的地是另一个用户。为此,我需要 root 来执行mount
命令。为了能够在不使用 root 或 sudo 的情况下运行代码,我看了一下这个问题。我创建了 c 代码,对其进行编译并设置了适当的权限 ( root.root, rwsr,sr...
)。我在一个 php 文件中运行代码:
<?php
// filename over.php
print shell_exec("whoami")."\n";
print shell_exec('/var/www/vhosts/user/deployment/exec "sudo mount -t overlay overlay -o lowerdir=/var/www/vhosts/user/deployment/template5_dev,upperdir=/var/www/vhosts/user.deve/httpdocs,workdir=/var/www/vhosts/user/deployment/overlay-work /var/www/vhosts/user.deve/httpdocs"');
代码所做的是打印实际用户名(以确保我有输出,查看代码是否执行)然后合并文件夹。该文件/var/www/vhosts/user/deployment/exec
是 c 程序,然后我将代码作为参数传递给执行。
在我运行的终端中:php -f "/var/www/vhosts/user/httpdocs/over.php"
. 我检查了合并的文件夹,我可以看到它有效。输出是user
.
然后我卸载覆盖sudo umount /var/www/vhosts/user.deve/httpdocs
。
我通过浏览器访问 php 脚本,我得到了输出user
,但文件夹没有合并。我 ctrl-f5 多次但没有,没有错误,日志中没有错误。
我将命令更改为从浏览器创建的文件夹shell_exec('/var/www/vhosts/user/deployment/exec "sudo mkdir /var/www/vhosts/user.deve/httpdocs/nouvo"');
。sudo
我注意到只有mount
命令无法正常运行。
apache无法运行命令的原因可能是什么sudo mount
,即使出现错误,它也不会打印出错误吗?
我只是看看/var/log/kern.log
。我可以看到mount
从网络浏览器执行的命令。但是日志与在终端中执行的日志不同。
从网络浏览器:
kernel: [ 149.465459] overlayfs: filesystem on '/var/www/vhosts/user.deve/httpdocs' not supported as upperdir
kernel: [ 151.629192] overlayfs: filesystem on '/var/www/vhosts/user.deve/httpdocs' not supported as upperdir
kernel: [ 153.453612] overlayfs: filesystem on '/var/www/vhosts/user.deve/httpdocs' not supported as upperdir
从浏览器执行后从终端:
kernel: [ 312.858797] overlayfs: upperdir is in-use as upperdir/workdir of another mount, accessing files from both mounts will result in undefined behavior.
kernel: [ 312.858804] overlayfs: workdir is in-use as upperdir/workdir of another mount, accessing files from both mounts will result in undefined behavior.
我只是没有从浏览器获取日志,因为脚本是相同的。