直接运行umask命令即可查看当前shell会话生效的八进制掩码值(如0027),加-s参数显示符号形式;该值仅反映当前shell实际生效值,不表示配置文件是否已正确加载或全局生效。

怎么查当前生效的 umask 值
直接运行 umask 命令就能看到当前 shell 会话的掩码值,比如输出 0027;加 -S 参数(umask -S)会显示符号形式,如 u=rwx,g=rx,o=---。注意:这个值只反映当前 shell 的实际生效值,不等于你改过哪份配置文件——很多用户改了 /etc/profile 却忘了 source 或重新登录,结果 umask 还是老样子。
为什么只改 ~/.bashrc 不一定管用
不同登录方式加载的初始化文件不一样:ssh 登录走 ~/.bash_profile 或 ~/.profile,图形终端可能只读 ~/.profile,而新打开的非登录终端(比如 GNOME Terminal 默认)只读 ~/.bashrc。所以单写 ~/.bashrc 容易漏掉场景。
- 稳妥做法:在
~/.profile末尾加umask 0027,再在~/.bashrc里加一句if [ -f ~/.profile ]; then . ~/.profile; fi(或直接把 umask 行也抄过去) - 别在
~/.bashrc里用source ~/.profile—— 可能引发重复执行或变量污染 -
systemd --user服务、cron job、scp上传等完全不加载这些 shell 文件,它们的 umask 由 PAM 或 sshd 配置决定
全局设置必须走 PAM,不是改 /etc/profile
/etc/profile 只影响 shell 登录,对 su、sudo、图形界面登录、SSH 密钥登录等都不保证生效。真正覆盖所有 PAM 认证路径的方式是改 PAM 配置:
- Debian/Ubuntu:编辑
/etc/pam.d/common-session,添加一行:session umask=0027 - RHEL/CentOS:编辑
/etc/pam.d/system-auth,在session optional pam_umask.so行后加session umask=0027(确保pam_umask.so已安装) - 该设置优先级高于 shell 配置,且对
sshd、gdm、login全部生效 - 改完立刻验证:新开 SSH 连接后运行
umask,必须是0027才算成功
umask 改了但新建文件权限不对?检查这三点
常见错觉是“设了 umask 就万事大吉”,其实权限还受其他机制干扰:
-
cp、rsync、tar等命令默认保留源文件权限,不会套用当前 umask —— 用cp --no-preserve=mode或rsync -p控制 - 编辑器(如 vim、nano)创建文件时可能覆盖 umask:vim 默认用
644,需在~/.vimrc加set backupcopy=yes并确认umask生效 - 脚本里临时改 umask(如
umask 077)只作用于该脚本内部,退出后不影响父 shell,也绝不会改变家目录本身权限
真正要让家目录“私有”,得两步走:先用 chmod 700 /home/username 改已有目录权限,再用 PAM + shell 配置锁死后续新建内容的默认掩码。漏掉任何一步,都可能留出可被遍历或写入的缝隙。











