2

环境

  • PHP -V 输出:带有 Suhosin-Patch (cli) 的 PHP 5.3.5-1ubuntu7.2(构建时间:2011 年 5 月 2 日 23:00:17)版权所有 (c) 1997-2009 The PHP Group Zend Engine v2.3.0,版权所有 ( c) 1998-2010 Zend Technologies
  • cat /etc/issue 输出: Ubuntu 11.04
  • Apache2 -V 输出:服务器版本:Apache/2.2.17 (Ubuntu) 服务器构建:2011 年 9 月 1 日 09:31:14
  • 浏览器关于输出: Firefox 6.0.2

PS -AUX输出

root      2943  0.0  0.3 206420 12428 ?        Ss   Sep19   0:20 /usr/sbin/apache2 -k start
www-data 18658  0.0  0.2 208552 11096 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18659  0.0  0.3 208976 12036 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18660  0.0  0.3 210532 12476 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18661  0.0  0.3 210276 11820 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18662  0.0  0.2 206948 10236 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 20037  0.0  0.3 208976 12128 ?        S    08:22   0:00 /usr/sbin/apache2 -k start
www-data 20039  0.0  0.3 209132 11748 ?        S    08:23   0:00 /usr/sbin/apache2 -k start
www-data 20120  0.0  0.3 209004 12000 ?        S    09:04   0:00 /usr/sbin/apache2 -k start

文件权限

drwxr-xr-x 2 www-data www-data   4096 2011-09-26 15:24 .
drwxr-xr-x 4 www-data www-data   4096 2011-08-26 11:31 ..
-rw-r--r-- 1 root     root     161976 2011-08-26 16:26 market.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test1.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test2.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test3.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test4.txt
-rw-r--r-- 1 root     root          0 2011-09-26 15:02 test5.txt

代码

rename($file, "$dest/$file");

问题

当我对上面“文件权限”部分中列出的文件运行上述代码时,它会正确地将文件从当前位置移动到新位置并删除原始位置。当 apache2 作为 www-data 运行并且文件由 root 拥有并且仅对非 root 用户具有读取权限时,这怎么可能?在 PHP 文档中它说:

如果目标文件系统不允许对文件进行 chown() 或 chmod() 系统调用,则可能会生成警告 - 例如,如果目标文件系统是 FAT 文件系统。

rename() 在此过程中是否调用了这些系统函数中的任何一个?如果是这样,为什么?无论如何,这并不重要,因为 www-data 无论如何都不应该能够 chown/chmod 由 root 拥有的文件。

谁能向我解释这是怎么发生的?

附加信息

  • 我已经用 root 和 www-data 拥有的 PHP 脚本尝试了这个,它可以工作。

我试图提供尽可能多的相关信息,但如果您需要其他信息,请告诉我。

4

2 回答 2

4

移动不会“删除”原始文件,除非移动跨越文件系统边界。在单个文件系统中,移动只是重写相关的目录条目,因此看起来您已经复制/删除了文件,但您所做的只是一些家务。由于 www-data 拥有相关目录,它可以重写代表那些文件的目录条目,并且永远不会触及实际文件。

于 2011-09-26T19:53:43.533 回答
1

移动文件时,您不是在编辑文件本身,而是在编辑它们所在的目录。在您的情况下,该目录归www-data(apache 进程)所有

于 2011-09-26T19:54:41.133 回答