umask 是权限“遮罩”,用于从文件默认权限666和目录默认权限777中按位屏蔽(而非减法)对应权限位;其值为八进制,每位表示属主、组、其他用户被禁用的权限,如022得文件644、目录755。

Linux 中的 umask 不是“设置权限”,而是“屏蔽掉哪些默认权限位”。它从文件基础权限 666(无执行位)和目录基础权限 777(含执行位)中,按位屏蔽对应权限,从而决定新建项的实际权限。
理解 umask 的计算逻辑
umask 值是八进制掩码,每一位代表一类用户(属主、组、其他)被禁止的权限:
- 0:不屏蔽任何权限(rwx 全开)
- 2:屏蔽写(w)权限
- 4:屏蔽读(r)权限
- 1:屏蔽执行(x)权限(但普通文件默认不带 x,所以 umask 对文件执行位无实际影响)
实际权限 = 基础权限 & (~umask),不是简单减法,但在八进制下多数情况可近似为减法:
- umask 022 → 文件 644(-rw-r--r--),目录 755(drwxr-xr-x)
- umask 002 → 文件 664(-rw-rw-r--),目录 775(drwxrwxr-x)
- umask 077 → 文件 600(-rw-------),目录 700(drwx------)
临时设置当前终端的默认权限
只对当前 shell 有效,适合测试或单次操作:
- 查看当前值:
umask - 设为协作模式:
umask 002 - 设为高敏隔离:
umask 077 - 验证效果:运行
touch f && mkdir d && ls -ld f d,确认输出符合预期
永久设置所有新登录会话的默认权限
推荐优先改用户级配置,避免影响系统其他用户:
- 查清当前 shell:
echo $SHELL(如/bin/bash就改~/.bashrc;/bin/zsh就改~/.zshrc) - 编辑对应文件,末尾添加一行:
umask 027(协作安全)或umask 077(完全私有) - 立即生效:
source ~/.bashrc(或对应文件名) - 注意:若
~/.bash_profile存在且未加载~/.bashrc,需把 umask 行直接加到前者里
系统级统一设置(生产环境必须做)
仅改用户配置无法覆盖 su、sudo -i、cron、systemd --user 等场景,必须配合两层机制:
-
/etc/login.defs:控制
useradd创建的新用户初始 umask,确保账号生命周期起点安全。确认存在未注释行:UMASK 027 -
PAM 模块:编辑
/etc/pam.d/common-session(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS),添加:session optional pam_umask.so umask=0027
若提示模块缺失,先安装libpam-umask包
验证时务必新开干净终端(如 SSH 重连),执行创建测试,不能只看 umask 命令输出。


















