在php中,我做了以下操作:
exec('remove_file.sh', $output, $return);
remove_file.sh是以下脚本:
#!/bin/sh
rm -f /tmp/test.pdf
我验证了这个脚本是由www-data运行的,test.pdf由myuser拥有,但具有666 (rw-rw-rw-)权限。/tmp为root所有,权限为666。
脚本返回1(一般错误),没有任何输出。
如果我在终端上尝试:
sudo su www-data -c 'rm -f /tmp/test.pdf'
我:
cannot remove `/tmp/test.pdf': Operation not permitted
如何从php脚本中删除这个文件?
您可能必须确保www-user
具有对目录和文件的写权限。这取决于文件系统,但是对于rm
或mv
操作,大多数都需要这个。
所以chmod 777 /tmp
应该能做到。
Edit:上述方法可能不是实现所需可用性的安全方法。根据您的设置,完成此任务的更彻底的方法是将www-user
添加到users
组(假设myuser
主组是users
),然后将/tmp
目录设置为rwx,用于用户&组。
# usermod -g users www-user
# chmod 770 /tmp
允许每个人在/tmp
中读取,写入和执行不适合多用户或不安全的盒子,虽然它可能在一个安全的服务器上工作得很好,但你给了任何破坏盒子的人很多访问权。
一个更好的选择是让php上传文件到更本地的目录,而不是使用bash脚本使用$_FILES,然后再次使用php通过unlink删除它们。这样,所有文件都将属于www-user
。请记住,在允许上传之前彻底验证文件,以防止c99和类似恶意软件的攻击。
EDIT (from OP):
虽然安全问题不适用于我的情况,但我完全同意前面的编辑。使用/tmp是偷懒的出路。但真正的问题是,我测试了在我自己的用户下创建一个文件,然后从www-data继续测试。在/tmp的默认权限下,您不能(正确地)删除或覆盖另一个用户的文件。这导致了各种各样的问题,不仅仅是rm.