umask是控制新文件/目录默认权限的核心机制,通过从默认权限777(目录)或666(文件)中按位屏蔽权限实现,而非直接设置;临时修改用umask命令,永久生效需配置shell文件或systemd的UMask参数。

umask 是控制默认权限的核心机制
Linux 不通过 chmod 设置新文件/目录的默认权限,而是靠 umask——它不是“设权限”,而是“屏蔽哪些位”。系统给新目录的起点权限恒为 777,新文件恒为 666,然后按位取反再与 umask 做与运算:777 & (~umask)(目录)、666 & (~umask)(文件)。这不是简单减法,但八进制下多数情况可近似理解。
常见误区:以为 umask 002 就等于“目录一定是 775”,其实它只保证“组写位不被屏蔽”,最终结果由内核和 shell 实现一致保障。另外,目录永远带 x(否则无法 cd),文件永远不带 x(除非显式加)。
临时修改:只影响当前终端会话
适合测试或单次操作,退出即失效,安全无副作用:
- 运行
umask 002→ 新目录775,新文件664 - 运行
umask 077→ 新目录700,新文件600 - 验证是否生效:执行
mkdir testdir && touch testfile && ls -ld testdir testfile,观察输出权限
永久生效:改用户级 shell 配置文件
推荐编辑 ~/.bashrc(对交互式非登录 shell 有效)或 ~/.profile(对登录 shell 有效),添加一行即可:
- 团队协作场景:末尾加
umask 002 - 个人隐私优先:末尾加
umask 077 - 保存后立即加载:
source ~/.bashrc(不用重启终端) - 注意:如果
~/.bashrc和~/.profile都写了umask,以最后被读取的为准;systemd 服务、nginx 等后台进程不读这些文件,它们的umask需单独在启动脚本或 unit 中用UMask=指定
共享目录需要继承组权限?setfacl -d 更可靠
umask 是全局粗粒度控制,无法让某个特定目录下的新文件自动属于某组。这时得用 ACL:
- 确认文件系统挂载时启用了
acl:运行mount | grep $(df . -P | tail -1 | awk '{print $1}'),看输出含不含acl - 设置默认 ACL:
setfacl -d -m g:developers:rwx /srv/project - 此后在
/srv/project下新建的子目录/文件,都会自动获得developers组的rwx权限,且不受当前umask影响 - 注意:
setfacl -d不改变已有文件权限,只作用于未来创建项
真正容易被忽略的是:服务进程(比如用 systemctl start myapp 启动的 Java 应用)根本不会加载你的 ~/.bashrc,它的 umask 默认可能是 022 或由 systemd 的 UMask= 字段决定——这时候改用户配置毫无意义。


















