umask

出自 Arch Linux 中文维基

掩碼工具用於控制文件創建模式掩碼,它決定新創建文件的文件權限位的初始值。這個工具的行為是由 POSIX 標準化,並在 POSIX 開發者手冊中描述。因為掩碼值會影響當前的 shell 執行環境,所以它通常作為 shell 的內置命令實現。

模式掩碼的含義[編輯 | 編輯原始碼]

模式掩碼包含在新創建的文件上不應該設置的權限位,因此它是在新創建的文件上設置的權限位的邏輯非。如果掩碼值中的某些位被設置為1,新創建文件的相應權限將被禁用。因此,掩碼值就像一個過濾器,可以剝離權限位,有助於設置文件的默認訪問權限。

在新創建的文件上設置權限位的結果是用位法實質非蘊涵(也稱為否定)計算的,可以用邏輯符號表示。

R: (D & (~M))

也就是說,產生的權限 R 是默認權限 D位與和文件創建模式屏蔽 M位非的結果。

注意:
  • Linux 不允許以執行權限創建文件,目錄的默認創建權限為777,文件的默認創建權限為666
  • 在Linux下,只使用掩碼值的文件權限位--見 umask(2)。掩碼值中的 suidsgidsticky 位被忽略。

例如,讓我們假設文件創建模式掩碼為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

參見[編輯 | 編輯原始碼]