Linux umask 详解:创建文件权限错乱的真正原因

一、什么是 umask?

umask(User Mask / File Mode Creation Mask)是文件默认权限的屏蔽值

当你在 Linux 中新建文件或目录时:

系统会先给它一个“最大默认权限”;然后再用 umask 去掉一些权限;得到最终权限。文件最大默认权限666 (rw-rw-rw-)目录最大默认权限777 (rwxrwxrwx)

最终权限计算公式:

复制
最终权限 = 最大默认权限 - umask1.

👉 举个例子:

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 │ └────────────────────────┘1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.

二、如何查看 umask?

1. 当前环境

复制
umask1.

直接输出当前 shell 的 umask,比如:0022

2. 模拟完整登录环境

复制
su -l -c "umask" root/test1.

这会切换到 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 "未设置"1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.

👉 或者直接搜:

复制
grep -R umask /root/.* /etc/profile* /etc/bashrc /etc/login.defs1.

📌 对比总结

方法

说明

适用场景

umask

查看当前用户/当前 shell 环境

日常使用

su -l -c "umask" 用户

查看目标用户真实登录环境

系统排查 / 安全审计

✅ 推荐:做安全基线检查时,一定要用 第二种方式,结果才准确。

三、如何修改 umask?

1. 临时修改(仅当前会话有效)

复制
umask 0271.

退出 shell 后失效。

2. 永久修改(写入配置文件)

全局生效

     a./etc/profile

     b./etc/bashrc 或 /etc/bash.bashrc

单个用户生效

        a. ~/.bashrc

        b.~/.bash_profile

示例:

复制
echo "umask 027" >> ~/.bashrc source ~/.bashrc1.2.

四、为什么 umask 会不一样?

常见现象:同一个环境采用2种方式检查,结果不同

复制
[root@host ~]# su -l -c "umask" root 0027 [root@host ~]# umask 00221.2.3.4.5.

通过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,既保证可用性,又兼顾安全性。

THE END