Linux umask 詳解:創建文件權限錯亂的真正原因

一、什么是 umask?
umask(User Mask / File Mode Creation Mask)是文件默認權限的屏蔽值。
當你在 Linux 中新建文件或目錄時:
- 系統會先給它一個“最大默認權限”;
- 然后再用
umask去掉一些權限; - 得到最終權限。
- 文件最大默認權限:
666 (rw-rw-rw-) - 目錄最大默認權限:
777 (rwxrwxrwx)
最終權限計算公式:
最終權限 = 最大默認權限 - umask?? 舉個例子:
umask = 022
a.文件:666 - 022 = 644 (rw-r--r--)
b.目錄:777 - 022 = 755 (rwxr-xr-x)
umask = 002
a.文件:664 (rw-rw-r--)
b.目錄:775 (rwxrwxr-x)
這就是為什么不同環境下創建的文件權限不同。
下面是一個可視化的流程圖??
最終結果就是你創建文件/目錄時看到的默認權限。
┌────────────────────────┐
│ 文件/目錄默認權限值 │
│ 文件:666 目錄:777 │
└───────────┬──────────┘
│
▼
┌──────────────────────┐
│ 當前用戶 umask │
│ (如 022, 027 等) │
└───────────┬──────────┘
│
▼
┌────────────────────────┐
│ 默認權限 - umask 位 │
│ (按位“與非”運算 ~umask)│
└───────────┬──────────┘
│
▼
┌────────────────────────┐
│ 實際生效權限 │
│ 文件:如 644 目錄:755 │
└────────────────────────┘二、如何查看 umask?
1. 當前環境
umask直接輸出當前 shell 的 umask,比如:0022。
2. 模擬完整登錄環境
su -l -c "umask" root/test這會切換到 root或者test用戶,并加載 對應用戶的完整登錄環境,得到 用戶真實使用的 umask。
3. 腳本檢測
寫一個小腳本,一次性檢查多處配置:
#!/bin/bash
echo"===== 當前 shell 的 umask ====="
umask
echo
echo"===== su - root 登錄環境的 umask ====="
su -l -c "umask" root
echo
echo"===== /etc/login.defs 中的默認 umask ====="
grep -E '^\s*UMASK' /etc/login.defs 2>/dev/null || echo"未設置"
echo
echo"===== /etc/profile* 和 /etc/bashrc 中的 umask 設置 ====="
grep -R "umask" /etc/profile* /etc/bashrc 2>/dev/null || echo"未設置"
echo
echo"===== root 用戶家目錄下的 umask 設置 ====="
grep -R "umask" /root/.* 2>/dev/null || echo "未設置"?? 或者直接搜:
grep -R umask /root/.* /etc/profile* /etc/bashrc /etc/login.defs?? 對比總結
方法 | 說明 | 適用場景 |
| 查看當前用戶/當前 shell 環境 | 日常使用 |
| 查看目標用戶真實登錄環境 | 系統排查 / 安全審計 |
? 推薦:做安全基線檢查時,一定要用 第二種方式,結果才準確。
三、如何修改 umask?
1. 臨時修改(僅當前會話有效)
umask 027退出 shell 后失效。
2. 永久修改(寫入配置文件)
- 全局生效
a./etc/profile
b./etc/bashrc 或 /etc/bash.bashrc
- 單個用戶生效
a. ~/.bashrc
b.~/.bash_profile
示例:
echo "umask 027" >> ~/.bashrc
source ~/.bashrc四、為什么 umask 會不一樣?
常見現象:同一個環境采用2種方式檢查,結果不同
[root@host ~]# su -l -c "umask" root
0027
[root@host ~]# umask
0022通過ansilbe創建文件夾,發現文件權限為750,而不是755,證明su -l -c umask root方式檢測的才是準的。
原因:
su -l root(帶-l)會模擬完整登錄環境,加載 root 的配置文件(如/etc/profile,~/.bashrc),因此得到更嚴格的0027。- 直接
umask繼承的是當前 shell 的環境,常見是0022。
五、總結
- umask 決定新建文件/目錄的默認權限。
- 文件最大
666,目錄最大777,減去 umask 就是最終權限。 - 查看 umask 有兩種方式:
a.umask → 當前環境
b.su -l -c "umask" 用戶 → 模擬完整登錄環境,ansible或者shell遠程執行用這種方式做環境檢查比較準確。
- 修改 umask 需要寫配置文件才能永久生效。
- 推薦配置:生產環境
027,既保證可用性,又兼顧安全性。




















