我正在尝试设置 ACL,以便在 Web 服务器目录中创建的新文件和目录的用户和组归 www-data 用户所有。我在另一台服务器上有完全相同的 ACL,它们工作正常。
andrew@sona:/srv/www$ getfacl .
# file: .
# owner: www-data
# group: www-data
user::rwx
group::rwx
group:www-data:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::rwx
default:group:www-data:rwx
default:mask::rwx
default:other::r-x
andrew@sona:/srv/www$ mount | grep acl
/dev/xvda on / type ext3 (rw,noatime,errors=remount-ro,acl)
andrew@sona:/srv/www$ touch test.txt
andrew@sona:/srv/www$ ll
total 12
drwxrwxr-x+ 3 www-data www-data 4096 Sep 3 17:14 ./
drwxr-xr-x+ 3 root root 4096 Sep 1 19:36 ../
-rw-rw-r--+ 1 andrew andrew 0 Sep 3 17:14 test.txt
服务器是Ubuntu 12.04 LTS
Distributor ID: Ubuntu
Description: Ubuntu 12.04.3 LTS
Release: 12.04
Codename: precise
答案1
访问控制列表(ACL)提供一种细粒度的机制来控制使用权到文件/目录。它们不会更改或定义所有权。
该default
值定义目录中新创建的文件应“继承”哪个 ACL。这些似乎适用于/srv/www
,因为您的新创建文件test.txt
会获得一些 ACL(请注意+
目录列表中的 )。
@Darius 链接的 SF 答案中给出了实现目标的要点:
chmod ug+s /srv/www
这就设置了设置用户 ID和设置组 IDcoreutils 的信息手册解释了这个机制:
27.5 目录和设置用户 ID 位以及设置组 ID 位
在大多数系统中,如果设置了目录的 set-group-ID 位,则新创建的子文件将继承与目录相同的组,而新创建的子目录将继承父目录的 set-group-ID 位。在少数系统中,目录的 set-user-ID 位对新子文件的所有权和新子目录的 set-user-ID 位具有类似的影响。(...)
请注意“在少数系统上”的限制设置用户 ID位。事实上,无论是在我的 Debian 还是 openSuSE 系统上,所有者的继承都不起作用,只有组被传播。根据维基百科,这对于全部Linux 系统:
在 UNIX 和 Linux 系统上,目录上设置的 setuid 权限会被忽略。[4]可以配置 FreeBSD 将其解释为类似于 setgid,即强制所有文件和子目录由顶级目录所有者拥有。[5]