在 Linux 系統中,每當使用者建立新檔案或目錄時,其預設權限並非隨機產生,而是由 umask(使用者檔案建立模式遮罩)精確計算而來。理解並善用 umask,是系統管理員、開發人員與 DevOps 工程師構建安全、可協作檔案系統的基礎技能。
umask 定義了「建立檔案或目錄時需**移除**的權限位」。它以八進位或符號模式表示,直接影響預設權限的最終呈現。
[root@linux ~]# umask
0022
[root@linux ~]# umask -S
u=rwx,g=rx,o=rx
umask 顯示四位八進位數(首位為特殊權限位,常為 0)。-S 參數則以符號模式顯示(r=讀、w=寫、x=執行)。系統對檔案與目錄的「最大預設權限」定義不同:
| 物件類型 | 最大預設權限(八進位) | 權限符號 | 備註 |
|---|---|---|---|
| 檔案 | 666 | -rw-rw-rw- | 預設無執行權限(x),避免誤執行 |
| 目錄 | 777 | drwxrwxrwx | 需執行權限(x)才能 cd 進入 |
許多教材以二進位 AND/NOT 運算解釋 umask,但**符號減法更直觀**:「基礎預設權限」減去「umask 遮罩」等於「最終權限」。
以預設 umask 0022 為例(移除 group 與 others 的寫入權限 w=2):
666 (rw-rw-rw-) − 022 (---w--w-) = 644 (rw-r--r--)777 (rwxrwxrwx) − 022 (---w--w-) = 755 (rwxr-xr-x)[root@linux ~]# umask 0022
[root@linux ~]# touch test1
[root@linux ~]# mkdir test2
[root@linux ~]# ll
-rw-r--r-- 1 root root 0 Jul 20 00:36 test1
drwxr-xr-x 2 root root 4096 Jul 20 00:36 test2
若開發團隊需同群組成員可讀寫彼此檔案,期望檔案權限為 664 (rw-rw-r--)、目錄為 775 (rwxrwxr-x),則需設定 umask 002(僅移除 others 的寫入權限)。
[root@linux ~]# umask 002
[root@linux ~]# touch test3
[root@linux ~]# mkdir test4
[root@linux ~]# ll
-rw-rw-r-- 1 root root 0 Jul 20 00:41 test3
drwxrwxr-x 2 root root 4096 Jul 20 00:41 test4
此設定廣泛應用於 Samba、FTP、NFS 等共享儲存服務,確保團隊協作順暢且不洩露給其他使用者。
部分教材建議用 666 - umask 計算檔案權限,這是**錯誤**的。例如 umask 003:
666 - 003 = 663 → -rw-rw--wx(檔案莫名出現執行權限 x)666 (rw-rw-rw-) − 003 (------wx) = 664 (rw-rw-r--)根本原因:檔案基礎預設權限**本就不含 x**,若用數學減法會錯誤「借位」產生 x 權限。請務必採用符號減法或位運算(mode = base & ~umask)。
假設 umask = 003,試求建立檔案與目錄的最終權限。
003 代表移除 others 的寫入 (2) + 執行 (1) = 3666 (rw-rw-rw-) − 003 (------wx) = 664 (rw-rw-r--)777 (rwxrwxrwx) − 003 (------wx) = 774 (rwxrwxr--)/etc/profile 或 /etc/login.defs 設定 umask 022,平衡安全與便利。setgid(chmod g+s dir)並設定 umask 002,新檔自動繼承群組與群組寫入權限。umask 027 或 077,嚴格限制他人存取。umask 指令寫入 ~/.bashrc、~/.profile 或服務的 systemd unit 檔 UMask= 參數。掌握 umask,不僅是背誦數字對照表,更是理解 Linux 權限模型「預設安全、最小權限」設計哲學的關鍵一步。