在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脚本中删除此文件?
答案 0 :(得分:2)
您可能必须确保www-user
对目录以及文件具有写入权限。这取决于文件系统,但大多数都需要rm
或mv
操作。
所以chmod 777 /tmp
应该做到这一点。
编辑:上述内容可能不是实现所需可用性的安全方式。根据您的设置,更全面的方法是将www-user
添加到users
组(假设myuser
主要组为users
),然后设置{ {1}}目录到rwx用户和&基。
/tmp
允许每个人在# usermod -g users www-user
# chmod 770 /tmp
中阅读,编写和执行不适合多用户或不安全的盒子,虽然它可以在安全性很好的服务器上正常工作,但您可以向任何人提供大量访问权限。妥协了。
更好的选择是让php将文件上传到更本地的目录,而不是使用$_FILES使用bash脚本,然后再次使用PHP将其删除unlink。这样所有文件都属于/tmp
。请记住,在允许上传以防止通过c99 and similar malware进行攻击之前,必须彻底验证文件。
编辑(来自OP):
虽然安全问题不适用于我的案例,但我完全赞同上一次编辑。使用/ tmp是懒惰的出路。但真正的问题是我测试了在我自己的用户下创建文件,然后继续从www-data进行测试。在/ tmp的默认权限下,您不能(正确地)删除其他用户文件,也不能覆盖它。这导致了各种问题,不仅仅是rm。