umask 是什么
umask 是权限掩码,定义新建文件与目录时要从默认权限里去掉哪些位。系统给普通文件的默认上限是 666(新建文件不会自带执行位),目录是 777。掩码 022 对应文件 644、目录 755;掩码 027 对应 640 与 750。它只影响新建对象,不能收窄已有文件的权限,也不能放大默认上限。
基本信息
| 用途 | 设定新建文件与目录的默认权限掩码 |
|---|---|
| 语法 | umask [掩码];umask -S 以符号形式显示;umask -p 输出可复用的命令形式 |
| 作用范围 | 当前 shell 会话及其子进程;持久化可写 /etc/profile 或 login.defs |
| 所属 | shell 内建命令,默认值来源之一是 /etc/login.defs 的 UMASK 项 |
典型使用场景
- 收紧默认权限:服务器上把 umask 调到 027 或 077,减少新建文件的暴露面
- 组内共享目录:协作目录用 002 让同组成员可写,配合 SGID 保持属组一致
- 脚本内保护敏感产物:生成密钥、凭据前先设定严格掩码,避免出现短暂的宽权限窗口
- 排查权限来源:新建文件权限不对时,先看当前 umask 是多少
- 服务级统一:给应用设定固定的 UMask,避免手工执行与定时执行产生不一致的权限
查看、设定与验证
查看、设定与验证
umask # 以八进制显示当前值,如 0022
umask -S # 符号形式:u=rwx,g=rx,o=rx
umask 027 # 收紧:同组可读,其他人无权限
touch f1; mkdir d1; stat -c '%a %n' f1 d1 # 验证结果:文件 640、目录 750
echo 'umask 027' | sudo tee -a /etc/profile # 对登录用户持久化
echo 'umask 027' | sudo tee /etc/profile.d/umask.sh # 或放在 profile.d 下统一管理脚本内保护敏感文件
脚本内保护敏感文件
#!/usr/bin/env bash
umask 077 # 之后新建的文件只有属主可读写
printf 'secret\n' > /etc/app/credential.key
stat -c '%a %n' /etc/app/credential.key # 期望 600
# systemd 服务可在单元里固定掩码
# [Service]
# UMask=0027掩码取值与结果对照
| umask | 新建文件 | 新建目录 | 典型用途 |
|---|---|---|---|
| 022 | 644 | 755 | 多数发行版的默认值,同组与他人可读 |
| 027 | 640 | 750 | 服务器收紧策略:他人完全无权限 |
| 077 | 600 | 700 | 只给属主,适合存放密钥与私有数据 |
| 002 | 664 | 775 | 组内协作目录,同组成员可写 |
写进 /etc/profile 只对登录 shell 生效,cron 与非交互 shell 通常不读它。要覆盖所有会话,可以改 /etc/login.defs 的 UMASK 项,或在 systemd 单元里设置 UMask=,两种方式管的是不同入口。
umask 只在新文件创建的那一刻起作用,不会修正已有文件的权限。发现历史文件权限过宽,要另外用 chmod 或 setfacl 处理。