为什么 FreeBSD 丢失了 w 掩码而 Debian 保留了它?

Rox*_*oxy 10 linux freebsd acl permissions

我试图了解 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
Run Code Online (Sandbox Code Playgroud)

我从 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
Run Code Online (Sandbox Code Playgroud)

请注意,outsideinside文件具有不同的权限。特别是,该outside文件具有-rw-r--r--,这是该用户的默认值,并且该inside文件具有-rw-rw----,尊重我分配给storage目录的默认 ACL 。

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
Run Code Online (Sandbox Code Playgroud)

(注意 Debiangetfacl也会显示默认 ACL,即使不使用-dwhere ,而 FreeBSD 不使用,但我认为实际的 ACL 并storage没有不同。)

在这里,outsideandinside文件也有不同的权限,但是inside文件没有 Debian 版本的组写权限,可能是因为 Debian 中的掩码保留了w而 FreeBSD 中的掩码丢失了w.

为什么 FreeBSD 丢失了w掩码而 Debian 保留了它?

poi*_*ige 1

简而言之,我\xe2\x80\x99d说(假设)他们\xe2\x80\x99以不同的方式使用umask。

\n\n

0022 正是 group-other unset W。您可以更改 umask 以解除写禁止并检查结果。

\n\n

引用 Solaris 又名 SunOS 手册(以及注释),因为这似乎非常相关:“\xe2\x80\xa6 如果目录包含默认 ACL 条目,则不会应用 umask(1)。\xe2\x80\xa6”

\n