umask
掩碼工具用於控制文件創建模式掩碼,它決定新創建文件的文件權限位的初始值。這個工具的行為是由 POSIX 標準化,並在 POSIX 開發者手冊中描述。因為掩碼值會影響當前的 shell 執行環境,所以它通常作為 shell 的內置命令實現。
模式掩碼的含義[編輯 | 編輯原始碼]
模式掩碼包含在新創建的文件上不應該設置的權限位,因此它是在新創建的文件上設置的權限位的邏輯非。如果掩碼值中的某些位被設置為1
,新創建文件的相應權限將被禁用。因此,掩碼值就像一個過濾器,可以剝離權限位,有助於設置文件的默認訪問權限。
在新創建的文件上設置權限位的結果是用位法實質非蘊涵(也稱為否定)計算的,可以用邏輯符號表示。
R: (D & (~M))
也就是說,產生的權限 R
是默認權限 D
的位與和文件創建模式屏蔽 M
的位非的結果。
- Linux 不允許以執行權限創建文件,目錄的默認創建權限為
777
,文件的默認創建權限為666
。 - 在Linux下,只使用掩碼值的文件權限位--見 umask(2)。掩碼值中的 suid、sgid 和 sticky 位被忽略。
例如,讓我們假設文件創建模式掩碼為027
。這裏,每個數字的位數表示為:
0
代表未在新創建的文件上設置的用戶權限位2
代表新創建文件未設置的組權限位7
代表新創建文件未設置的其他權限位
根據下表提供的信息,這意味着對於一個新創建的文件,例如由User1
用戶和Group1
組所擁有,User1
對新創建的文件擁有所有可能的權限(八進制值7
)。Group1
組的其他用戶沒有寫權限(八進制值5
),而其他用戶對新創建的文件沒有任何權限(八進制值0
)。因此,在本例中採取027
掩碼值,文件將以750
的權限創建。
八進制 | 二進制 | 含義 |
---|---|---|
0 |
000 |
無權限 |
1 |
001 |
只執行 |
2 |
010 |
只寫 |
3 |
011 |
可寫和執行 |
4 |
100 |
只讀 |
5 |
101 |
可讀和執行 |
6 |
110 |
可讀和寫 |
7 |
111 |
可讀,寫和執行 |
顯示當前掩碼值[編輯 | 編輯原始碼]
要顯示當前掩碼值,只需調用 umask
,不需要指定任何參數。默認的輸出方式取決於實現,但通常為八進制。
$umask
0027
當使用POSIX標準化的 -S
選項時,掩碼值將使用符號表示來顯示。然而,符號表示值總是用八進制值的邏輯補碼,即在新創建的文件上要設置的權限位:
$ umask -S
u=rwx,g=rx,o=
設置掩碼值[編輯 | 編輯原始碼]
useradd -m
默認創建具有 700
權限的目錄),因為其他人無法訪問其中的所有文件。如果這不切實際(例如,在使用 Apache HTTP Server 時),並且公共文件存儲在私有文件中,那麼請考慮限制掩碼值。可以通過 umask 命令設置掩碼值。指定模式掩碼的字符串遵循與 chmod 的模式參數相同的語法規則(詳見 POSIX 開發者手冊)。
全系統的掩碼值可以在 /etc/profile
或默認的 shell 配置文件中設置,比如 /etc/bash.bashrc
。大多數 Linux發行版,包括 Arch,都將掩碼值的默認值設置為022
。(見 /etc/profile)。也可以用 pam_umask.so
設置掩碼值,但它可能被 /etc/profile
或類似文件覆蓋。
如果需要設置不同的值,可以直接編輯該文件,從而影響所有用戶,或者從 shell 的用戶配置文件中調用 umask
,例如 ~/.bashrc
,只修改你的掩碼值,但這些修改只在下次登錄後生效。要想只在當前會話中改變掩碼值,只需運行 umask
並輸入你想要的值。例如,運行 umask 077
會給你新文件的讀寫權限,以及新文件夾的讀寫和執行權限。
設置 KDE / Plasma 的掩碼值[編輯 | 編輯原始碼]
通過 /etc/profile
設置掩碼值對 KDE / Plasma 會話不再有效,因為這些會話是以 systemd 用戶單元 的形式啟動。
掩碼值可以通過 pam_umask.so
或 systemd 的 附加配置片段 設置。
/etc/systemd/system/user@.d/override.conf
[Service] UMask=0002
使用 pam_umask.so
可以在一個環境為文本控制台和圖形 KDE 會話設置全系統的掩碼值。在 /etc/profile
或 systemd 配置中的任何改動都可以省略。因此,需要在 /etc/pam.d/login
和 /etc/pam.d/systemd-user
都包含的配置文件中啟用 pam_umask.so
。
在 /etc/pam.d/system-login
中添加以下一行:
# session optional pam_umask.so umask=022
參見[編輯 | 編輯原始碼]
- POSIX 開發者手冊:
- 掩碼值(可在 umask(1p) 閱讀)
- chmod(擴展說明)(可在 chmod(1p) 閱讀)
- 027 掩碼值:安全和簡單的折中方案