使用PHP将文件从一个用户复制到另一个用户

使用PHP将文件从一个用户复制到另一个用户

我确信这个问题的答案非常简单,而且它可能不是 PHP 特有的,但我正尝试使用 PHP 的 copy() 函数将图像从一个用户复制到另一个用户,作为自定义 CMS 设置的一部分。

例如:
copy('/home/user1/public_html/images/image.png', '/home/user2/public_html/images/image.png');
返回通常的结果:
[function.copy]: failed to open stream: Permission denied

我尝试过:
-CHMOD user2 的“images”文件夹为 777(仅用于测试,无效)
-创建一个新的系统组,将两个用户都放入其中,并将文件夹 CHGRP 为该组的 ID。还尝试将用户“apache”和“nobody”放入同一组,但没有效果。

open_basedir 未启用/配置(不确定这是否重要)并且 PHP 未处于安全模式。PHP5 处理程序是 suPHP,并且 suEXEC 已启用。在 CentOS 5.6 VPS 机上运行 WHM 11.3。我确信解决方案并不难,但我到处搜索,找不到答案。谢谢!

答案1

PHP 脚本通常以 Web 服务器用户身份运行。验证 Web 服务器用户是否有权源文件和到目标目录。
此外,如果您使用的是 Linux,请验证您的 SELinux 设置不会阻止 Web 服务器在 Web 根目录之外进行操作(请参阅copy()函数手册页上第一个用户贡献的注释)。

还要注意,在一般情况下,这样做是坏的idea -- SELinux 设置之所以如此严格,不允许 Web 服务器在 Web 根目录之外乱搞,是因为如果您的 PHP 脚本中存在错误,则会导致损坏。
如果 Web 服务器可以读取/写入随机文件系统位置,则可能会发生 Bad Things™。如果您的 PHP 代码编写不正确且没有得到妥善保护,这些 Bad Things™ 可能包括服务器入侵和大量时间/收入损失。
(换句话说,绝对肯定你需要在做这件事之前先做这个:-)

答案2

解决此类权限问题的一个好方法是使用 sudo -u apache(或任何正在运行的 apache)并尝试自己复制文件:

sudo -u apache cp -a /home/user1/public_html/images/image.png /home/user1/public_html/images/image.png

这有用吗?

相关内容