0

我的网站是关于复制文件的。我决定使用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.

我只是没有从浏览器获取日志,因为脚本是相同的。

4

0 回答 0