umask 如何影響 ACL?
umask
如果啟動 ACL,有人可以向我解釋如何影響新創建文件的預設遮罩嗎?是否有一些關於此的文件?例子:
$ mkdir test_dir && cd test_dir $ setfacl -m d:someuser:rwx -m u:someuser:rwx . # give access to some user $ getfacl . # file: . # owner: myUsername # group: myGroup user::rwx user:someuser:rwx group::--- mask::rwx other::--- default:user::rwx default:user:someuser:rwx default:group::--- default:mask::rwx default:other::--- $ umask # show my umask 077 $ echo "main(){}" > x.c # minimal C program $ make x # build it cc x.c -o x $ getfacl x # file: x # owner: myUsername # group: myGroup user::rwx user:someuser:rwx #effective:rw- group::--- mask::rw- other::---
我會期待
mask:rwx
。實際上,在設置umask
為 eg之後,027
我得到了預期的行為。
我找到了這個例子,標題為:ACL and MASK in linux。本文展示了以下範例,我認為這些範例有助於理解 ACL 以及如何
umask
相互互動。背景
在 Linux 系統上創建文件
0666
時應用預設權限,而創建目錄時0777
應用預設權限。範例 1 - 文件
假設我們將 umask 設置為 077 並觸摸一個文件。當我們這樣做時,我們可以使用它
strace
來查看實際發生的情況:$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 -rw-------. 1 root root 0 Sep 4 15:25 testfile
在此範例中,我們可以看到系統呼叫
open()
是使用權限 0666 進行的,但是當umask 077
核心隨後應用該權限時,會刪除以下權限 (---rwxrwx
),剩下的rw-------
就是 0600。範例 - 2 目錄
相同的概念可以應用於目錄,除了預設權限不是 0666,而是 0777。
$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir mkdir("testdir", 0777) = 0 drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir
這次我們使用
mkdir
命令。該mkdir
命令隨後呼叫了系統呼叫mkdir()
。在上面的範例中,我們可以看到該mkdir
命令呼叫了mkdir()
具有預設權限0777
(rwxrwxrwx
) 的系統呼叫。這次022
刪除了以下權限的 umask ( ),因此在創建目錄時----w--w-
我們只剩下 0755 ( )。rwxr-xr-x
範例 3(應用預設 ACL)
現在讓我們創建一個目錄並展示將預設 ACL 與其中的文件一起應用到它時會發生什麼。
$ mkdir acldir $ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir $ getfacl --all-effective acldir # file: acldir # owner: saml # group: saml user::rwx user:nginx:rwx #effective:rwx group::r-x #effective:r-x mask::rwx other::r-x default:user::rwx default:user:nginx:rwx #effective:rwx default:group::r-x #effective:r-x default:mask::rwx default:other::r-x
現在讓我們創建文件,
aclfile
:$ strace -s 128 -fvTttto luvly touch acldir/aclfile # view the results of this command in the log file "luvly" $ less luvly
現在獲取新創建文件的權限:
$ getfacl --all-effective acldir/aclfile # file: acldir/aclfile # owner: saml # group: saml user::rw- user:nginx:rwx #effective:rw- group::r-x #effective:r-- mask::rw- other::r--
注意麵具,
mask::rw-
。為什麼mask::rwx
不像創建目錄時那樣?檢查
luvly
日誌文件以查看創建文件時使用了哪些預設權限:$ less luvly |grep open |tail -1 10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>
這是它變得有點混亂的地方。將遮罩設置為
rwx
創建目錄時,您會期望創建文件的行為相同,但它不會那樣工作。這是因為核心正在open()
使用預設權限呼叫該函式0666
。總結
- 文件不會獲得執行權限(屏蔽或有效)。我們使用哪種方法無關緊要:ACL、umask 或 mask & ACL。
- 目錄可以獲得執行權限,但這取決於屏蔽欄位的設置方式。
- 為 ACL 權限下的文件設置執行權限的唯一方法是使用
chmod
.參考