Linux umask 詳解:創(chuàng)建文件權(quán)限錯(cuò)亂的真正原因

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




















