umask值通过终端执行umask命令查看,输出为八进制掩码(如0002),需与默认基线权限(文件666、目录777)按位取反运算得出实际权限;其生效位置取决于shell类型:登录shell读/etc/profile等,非登录shell读~/.bashrc;scp等工具不继承本地umask,需配置远端sshd的Umask或PAM;脚本内修改umask不影响父shell。

umask 值怎么查?别只看 umask 命令输出
终端里敲 umask 看到的八进制数(比如 0002)不是最终文件权限,它只是“掩码”,真正起作用的是它和系统默认基线权限的按位取反运算。普通文件默认基线是 666,目录是 777;umask 会从这些值里“砍掉”对应位的权限。
- 执行
umask显示0002→ 新建文件权限为664(即-rw-rw-r--),目录为775(drwxrwxr-x) - 如果显示
0027→ 文件变成640(-rw-r-----),目录是750(drwxr-x---) - 注意:
umask输出带前导0表示八进制,但部分 shell(如 zsh)可能省略——统一按八进制理解最稳妥
/etc/profile 和 ~/.bashrc 里改 umask,哪个才生效?
用户登录时,shell 会按顺序读取多个配置文件,umask 设置位置错了就白改。关键看你是交互式登录 shell 还是非登录 shell:
- 登录时(比如 SSH 进系统):优先加载
/etc/profile→/etc/profile.d/*.sh→~/.bash_profile或~/.bash_login或~/.profile(按存在顺序取第一个) - 非登录 shell(比如在已登录终端里新开个 bash):通常只读
~/.bashrc,除非显式用--login启动 - 所以:全局策略写
/etc/profile.d/umask.sh;仅当前用户调整,写进~/.bashrc并确保它被 source 过(检查是否有source ~/.bashrc或等效逻辑)
umask 设成 077 后,为什么 scp 传上来的文件还是 644?
scp、rsync、ftp 等工具上传文件时,**不走本地 shell 的 umask**,而是由远端服务进程(如 sshd)决定权限。sshd 默认用 PAM 模块或自身配置控制,和用户 shell 的 umask 无关。
- 验证方法:在目标机器上手动
touch testfile,对比权限是否和 scp 上传的一致 - 要统一 scp 权限,得改远端
/etc/ssh/sshd_config,加上Umask 0077(OpenSSH 7.9+ 支持),然后systemctl restart sshd - 老版本 OpenSSH 不支持
Umask配置项,只能靠PAM:在/etc/pam.d/sshd加一行session optional pam_umask.so umask=0077
脚本里临时改 umask,exit 后会不会影响父 shell?
不会。子进程(包括 shell 脚本)对 umask 的修改仅作用于自身及其子进程,退出后父 shell 的 umask 完全不受影响。
- 常见误操作:在脚本开头写
umask 0077,以为能保护后续所有操作,结果脚本一结束就失效 - 正确做法:若需长期限制权限,必须在 shell 初始化文件中设置;若只是某次命令需要,直接在命令前加
umask 0077; touch sensitive.txt,或用子 shell:(umask 0077; touch sensitive.txt) - 注意:某些语言运行时(如 Python 的
os.umask())也只影响当前进程,和 shell 行为一致
真正麻烦的是混合环境:既有 cron 任务、又有 systemd service、还有 web server 调用的 CGI 脚本——它们各自继承的 umask 来源不同,得一个个确认启动上下文。别假设“我设了 ~/.bashrc 就万事大吉”。










