umask - Arch Linux 中文维基

跳至內容

# umask

出自 Arch Linux 中文维基

翻譯狀態：

- 本文（或部分內容）譯自 Umask，最近一次同步於 2025-11-14，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- File permissions and attributes

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

## 模式掩碼的含義

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

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

    R: (D & (~M))

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

注意：

- 目錄的默認創建權限為`777`。
- 因為 Linux 不允許以執行權限創建文件，文件的默認創建權限為`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=

## 設置掩碼值

本文或本節內容已經過時。

原因： Arch 不使用 `/etc/profile` 設置默認的 umask, 參見 the news. This section needs to be updated accordingly. (在Talk:Umask討論)
注意：可以根據具體情況設置掩碼值。例如，桌面用戶可能會發現對其主文件夾的限制權限已足夠（`useradd -m` 默認創建具有 `700` 權限的目錄），因為其他人無法訪問其中的所有文件。如果這不切實際（例如，在使用 Apache HTTP Server 時），並且公共文件存儲在私有文件中，那麼請考慮限制掩碼值。

可以通過 umask 命令設置掩碼值。指定模式掩碼的字符串遵循與 chmod 的模式參數相同的語法規則（詳見 POSIX 開發者手冊）。

全系統的掩碼值可以在 `/etc/profile` (e.g. `/etc/profile.d/umask.sh`) 或默認的 shell 配置文件中設置，比如 `/etc/bash.bashrc`。大多數 Linux發行版，包括 Arch，都在 `/etc/login.defs` 將掩碼值的默認值設置為`022` 。也可以用 `pam_umask.so`設置掩碼值，但它可能被 `/etc/profile` 或類似文件覆蓋。

如果需要設置不同的值，可以直接編輯該文件，從而影響所有用戶，或者從 shell 的用戶配置文件中調用 `umask`，例如 `~/.bashrc`，只修改你的掩碼值，但這些修改只在下次登錄後生效。要想只在當前會話中改變掩碼值，只需運行 `umask` 並輸入你想要的值。例如，運行 `umask 077` 會給你新文件的讀寫權限，以及新文件夾的讀寫和執行權限。

如 pam_umask(8) § DESCRIPTION 中提到的, `umask=value` 也可以被用在 `/etc/passwd` 中的 Users and groups#User database 部分。參見 setting UMASK in GECOS field 的討論。

### 設置 KDE / Plasma 的掩碼值

通過 `/etc/profile` 設置掩碼值對 KDE / Plasma 會話不再有效，因為這些會話是以 systemd 用戶單元的形式啟動。

掩碼值可以通過 `pam_umask.so` 或 systemd 的附加配置片段設置。

    /etc/systemd/system/user@.service.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

### Site-specific

編輯 `/etc/login.defs` 並更新 `UMASK` 值。例如：

    /etc/login.defs

    UMASK 077

## 參見

- POSIX 開發者手冊:
  - 掩碼值(可在 umask(1p) 閱讀)
  - chmod（擴展說明）(可在 chmod(1p) 閱讀)
- 027 掩碼值：安全和簡單的折中方案

分類：​

- 安全
- 文件系統
- 命令
- 使用「模板:過時」標記的頁面或章節

umask
新增話題