我试图了解 FreeBSD ACL 和 Linux ACL 之间的行为差异。特别是默认 ACL 的继承机制。
我在 Debian 9.6 和 FreeBSD 12 上都使用了以下内容:
$ cat test_acl.sh
#!/bin/sh
set -xe
mkdir storage
setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
touch outside
cd storage
touch inside
cd ..
ls -ld outside storage storage/inside
getfacl -d storage
getfacl storage
getfacl outside
getfacl storage/inside
umask
我从 Debian 9.6 得到以下输出:
$ ./test_acl.sh
+ mkdir storage
+ setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
+ touch outside
+ cd storage
+ touch inside
+ cd ..
+ ls -ld outside storage storage/inside
-rw-r--r-- 1 aaa aaa 0 Dec 28 11:16 outside
drwxr-xr-x+ 2 aaa aaa 4096 Dec 28 11:16 storage
-rw-rw----+ 1 aaa aaa 0 Dec 28 11:16 storage/inside
+ getfacl -d storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::rwx
mask::rwx
other::---
+ getfacl storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::rwx
default:mask::rwx
default:other::---
+ getfacl outside
# file: outside
# owner: aaa
# group: aaa
user::rw-
group::r--
other::r--
+ getfacl storage/inside
# file: storage/inside
# owner: aaa
# group: aaa
user::rw-
group::rwx #effective:rw-
mask::rw-
other::---
+ umask
0022
请注意outside
和inside
文件具有不同的权限。特别是,outside
文件 has -rw-r--r--
,这是该用户的默认设置,inside
文件 has ,尊重我分配目录-rw-rw----
的默认 ACL 。storage
FreeBSD 12 上相同脚本的输出:
$ ./test_acl.sh
+ mkdir storage
+ setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
+ touch outside
+ cd storage
+ touch inside
+ cd ..
+ ls -ld outside storage storage/inside
-rw-r--r-- 1 aaa aaa 0 Dec 28 03:16 outside
drwxr-xr-x 2 aaa aaa 512 Dec 28 03:16 storage
-rw-r-----+ 1 aaa aaa 0 Dec 28 03:16 storage/inside
+ getfacl -d storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::rwx
mask::rwx
other::---
+ getfacl storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::r-x
other::r-x
+ getfacl outside
# file: outside
# owner: aaa
# group: aaa
user::rw-
group::r--
other::r--
+ getfacl storage/inside
# file: storage/inside
# owner: aaa
# group: aaa
user::rw-
group::rwx # effective: r--
mask::r--
other::---
+ umask
0022
(注意 Debiangetfacl
也会显示默认的 ACL,即使在-d
FreeBSD 不使用 where 时也不使用,但我认为实际的 ACL 并没有什么storage
不同。)
这里outside
和inside
文件也有不同的权限,但是inside
文件没有Debian版本的组写权限,可能是因为Debian中的掩码保留了,w
而FreeBSD中的掩码丢失了w
.
为什么 FreeBSD 失去了w
面具,但 Debian 保留了它?
简而言之,我会说(假设)他们以不同的方式使用 umask。
0022 恰好是 group-other unset W。您可以更改 umask 以删除写禁止并检查结果。
引用 Solaris aka SunOS 手册(以及注释),因为这似乎非常相关:“......如果目录包含默认 ACL 条目,则不会应用 umask(1)。......”