linux中umask不是设置权限而是屏蔽默认权限位:文件起点666、目录777,通过按位取反与运算(如666 & ~022=644)确定实际权限;支持临时设置(umask 022)和永久配置(写入~/.bashrc或/etc/login.defs)。

Linux 中通过 umask 控制新建文件的默认权限,核心不是“设置权限”,而是“屏蔽掉哪些默认权限位”。它作用于系统预设的起点权限:文件是 666(-rw-rw-rw-),目录是 777(drwxrwxrwx)。umask 值以八进制表示,每位对应属主、组、其他用户的被禁用权限。
umask 的权限屏蔽逻辑
umask 不做算术减法,而是按位取反后与起点权限做与运算(666 & (~umask) 或 777 & (~umask)),但日常使用中可近似理解为减法:
- 0:不屏蔽任何权限(rwx 全开)
- 2:屏蔽写(w)权限
- 4:屏蔽读(r)权限
- 1:屏蔽执行(x)权限(对普通文件无实际影响,因起点权限 666 本身不含 x)
例如:
umask 022 → 文件:666 & ~022 = 644(-rw-r--r--),目录:777 & ~022 = 755(drwxr-xr-x)
umask 002 → 文件:664(-rw-rw-r--),目录:775(drwxrwxr-x)
临时设置当前终端的默认权限
只影响当前 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命令输出











