Linux

為什麼 FreeBSD 失去了 w 遮罩而 Debian 保留了它?

  • January 2, 2019

我試圖了解 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

請注意outsideinside文件具有不同的權限。特別是,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,即使在-dFreeBSD 不使用 where 時也是如此,但我認為實際的 ACL 並沒有什麼storage不同。)

這里outsideinside文件也有不同的權限,但是inside文件沒有Debian版本的組寫權限,可能是因為Debian中的遮罩保留了,w而FreeBSD中的遮罩失去了w.

為什麼 FreeBSD 失去了w面具,但 Debian 保留了它?

簡而言之,我會說(假設)他們以不同的方式使用 umask。

0022 恰好是 group-other unset W。您可以更改 umask 以刪除寫禁止並檢查結果。

引用 Solaris aka SunOS 手冊(以及註釋),因為這似乎非常相關:“……如果目錄包含預設 ACL 條目,則不會應用 umask(1)。……”

引用自:https://unix.stackexchange.com/questions/491272