umask不是设置默认权限,而是屏蔽新文件(起点666)和目录(起点777)的权限位;002得664/775,022得644/755;非登录shell、服务进程等常不加载~/.bashrc导致失效。

umask 不是直接设置文件权限,而是决定新创建文件和目录“被砍掉哪些权限”。改对了,新建的 touch 文件、mkdir 目录、cp 生成的副本、脚本里 open() 创建的文件,才会按你预期受限或开放;改错了,可能让敏感配置文件被同组用户读到,或者协作目录下别人建的子目录进不去。
为什么 umask 002 和 umask 022 生成的文件权限不同
关键不是数字大小,而是它屏蔽了谁的什么位:
-
umask 022:把 group 和 others 的写位(w)全砍掉 → 文件变成644(rw-r--r--),目录变成755(rwxr-xr-x) -
umask 002:只砍 others 的写位 → 文件是664(rw-rw-r--),目录是775(rwxrwxr-x),适合共享工作区 -
umask 077:砍掉 group 和 others 的所有权限 → 文件600(rw-------),目录700(rwx------),最私密
注意:文件永远不会带执行位(x),哪怕 umask 000,因为内核强制过滤 —— 这和目录不同,目录必须保留 x 才能 cd 进入。
临时修改只在当前终端生效,但容易误判是否成功
运行 umask 002 后立刻验证,必须在同一 shell 进程里操作:
- 别用
sh -c "umask 002; touch a"——sh -c启的是子 shell,退出后父 shell 毫无变化 - 别在脚本里改完就跑,脚本结束,
umask就失效 - 正确姿势:
umask 002 && touch testfile && ls -l testfile,看是不是-rw-rw-r-- - 如果还是
-rw-r--r--,说明你可能在非交互式 shell(比如 cron 或 systemd service)里试的,那些环境不加载~/.bashrc
永久修改要选对配置文件,否则重启登录也不生效
不同登录方式加载的初始化文件不同,硬塞 /etc/profile 可能对 GUI 终端或 SSH 都无效:
- 交互式登录 shell(如 SSH 登录、图形界面终端首次打开):优先读
~/.bash_profile或~/.profile - 交互式非登录 shell(如 GNOME 终端点开新标签页):读
~/.bashrc—— 这是最常用、最稳妥的位置 - 系统级统一配置:不要直接改
/etc/profile,推荐在/etc/profile.d/下新建umask.sh,内容为umask 027,并确保可执行(chmod +x) - 编辑完记得重载:
source ~/.bashrc,或新开一个终端
某些程序完全无视 umask,别以为设了就万事大吉
很多工具在调用 open() 系统调用时,会显式传入权限参数(比如 0644),这时 umask 被绕过:
-
vim、nano保存新文件时,通常用0644,不受当前umask影响 -
gcc编译出的二进制文件默认是0755,固定值 -
tar、rsync在创建归档或同步时,也可能自行指定权限 - 真正受控的场景:纯 shell 命令如
touch、mkdir、cp(不带-p)、脚本里echo > file
所以,umask 是基础防线,不是万能锁;关键文件还得靠 chmod 二次加固,敏感目录得配 chmod 700 家目录,不能只依赖掩码。











