我有一个网站网络,所有网站共享同一个“图像”文件夹。我创建了 /home/_images/entities 并从所有网站对其进行了符号链接,它与 Apache 配合得很好,当我在任何网站上打开 /images/ 时,我都会获得图像列表并可以查看它们。
问题是 suPHP 会将 PHP 脚本的进程 ID 更改为文件所有者 ID,因此当我加载网站1.com,所有脚本均按以下方式执行用户1(并且使用这些脚本创建的文件/文件夹属于 user1:user1)。当我加载site2.com,所有脚本均按以下方式执行用户2(使用这些脚本创建的文件/文件夹属于 user2:user2)。所有这些用户都不属于同一组,我不想更改这一点,因为它是 cPanel/WHM 服务器,因此我担心如果我更改所有用户的(主要?)组,我会搞砸一些事情。
因此我需要以这样的方式进行设置,使得 /home/_images/entities(由 root 拥有)下的所有新创建的文件夹和文件对每个人都具有读/写权限。
这是我使用的命令:
setfacl -Rdm o::rwx /home/_images/entities
检查方法:
root@server1 [~]# getfacl /home/_images/entities/
getfacl: Removing leading '/' from absolute path names
# file: home/_images/entities/
# owner: root
# group: root
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::rwx
这看起来不错,但是当我尝试通过 site1.com 上传图像时,它看起来像这样:
root@server1 [/home/_images/entities]# ls -l
total 24
drwxrwxrwx+ 5 root root 4096 Jan 14 06:25 ./
drwxrwxrwx 5 root root 4096 Jan 12 13:08 ../
drwxrwxr-x+ 3 user1 user1 4096 Jan 14 06:25 1/
文件夹“1”中是图像(和缩略图文件夹):
root@server1 [/home/_images/entities/1]# ls -l
total 236
drwxrwxr-x+ 3 user1 user1 4096 Jan 14 06:25 ./
drwxrwxrwx+ 5 root root 4096 Jan 14 06:25 ../
-rw-rw-rw- 1 user1 user1 225569 Jan 14 06:25 689048f221ab7c556f4d482a9d92b2d6.jpg
drwxrwxr-x+ 2 user1 user1 4096 Jan 14 06:25 thumbs/
我的问题:
1) 为什么新创建的文件夹对其他所有人(不是用户和/或组)没有“写入”权限?如果我从 site1.com 上传第一张图片,那么我就无法从任何其他网站上传其他图片,而所有网站都可以显示它们。
2)权限列表末尾的“+”是什么?(drwxrwxr-x+)
3) 为什么新创建的文件仅对用户、组和其他所有人都具有“rw”权限,而没有执行权限?我实际上不需要在这里设置执行标志,但从我的命令中您可以看到我已设置“o::rwx”,因此它应该在那里(或不在那里?)
实际上真正的问题是#1 - 其他用户无法写入此文件夹,因此用户无法从其他网站上传图像,其他网站也无法创建(丢失的)缩略图。
答案1
应用程序(在本例中为 suPHP)可以覆盖默认值并明确设置所需的权限。如果 suPHP 强制将“其他”权限设置为您不想要的权限,则一种解决方法是为不同的组(例如用户)添加 ACL,其中包含 user1 和您想要的所有其他用户:
setfacl -Rdm g:users:rwx /home/_images/entities
那么 suPHP 可能会保留该权限。请注意,从安全角度来看,这也是更好的选择,因为您只向用户组授予写入权限,而不是向所有人授予写入权限。
这
+
意味着存在 ACL,因此除了列出的 ugo 集之外,其他权限也有效。您必须运行 getfacl 才能看到它们。我认为这与 #1 的答案相同:因为 suPHP 明确覆盖了执行权限。应采用与 #1 相同的解决方案。