环境
- PHP -V 输出: PHP 5.3.5-1ubuntu7.2 与 Suhosin-Patch (cli)(构建时间:2011 年 5 月 2 日 23:00:17) 版权所有 (c) 1997-2009 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 文档中它说:
Warnings may be generated if the destination filesystem doesn't permit chown() or chmod() system calls to be made on files — for example, if the destination filesystem is a FAT filesystem.
rename() 在此过程中是否调用这些系统函数?如果是这样,为什么?无论如何,这并不重要,因为 www-data 无论如何都不应该能够 chown/chmod root 拥有的文件。
谁能向我解释一下这是怎么发生的?
其他信息
- 我已经使用 root 和 www-data 拥有的 PHP 脚本尝试过此操作,并且它有效。
我尝试提供尽可能多的相关信息,但如果您需要其他信息,请告诉我。
最佳答案
移动不会“删除”原始文件,除非移动是跨文件系统边界进行的。在单个文件系统中,移动只是重写相关的目录条目,因此看起来您已经复制/删除了该文件,但您所做的只是一些内务处理。由于 www-data 拥有相关目录,因此它可以根据需要重写代表这些文件的目录条目,而永远不会触及实际文件。
关于PHP rename() 忽略权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560502/