umask不是设置默认权限,而是定义创建文件或目录时自动屏蔽的权限位;实际权限由“文件0666 & (~umask)、目录0777 & (~umask)”计算,且普通文件永远无执行位。

umask 不是“设置默认权限”,而是定义进程创建文件或目录时自动屏蔽哪些权限位。它作用于 open()、mkdir() 等系统调用传入的初始权限,影响的是新对象的起点权限,而不是事后 chmod。
实际权限由公式决定:
文件:0666 & (~umask)
目录:0777 & (~umask)
注意:普通文件永远不带执行位(x),这是内核强制行为,umask 无法绕过。
查看当前 umask 值
umask # 显示八进制值,如 0022 umask -S # 显示符号形式,如 u=rwx,g=rx,o=rx
输出 0022 表示:用户(u)不限制、组(g)屏蔽写(w)、其他(o)屏蔽写(w)。
临时设置(仅当前 shell 有效)
适合测试或单次任务:
-
umask 002→ 文件664(-rw-rw-r--),目录775(drwxrwxr-x) -
umask 027→ 文件640(-rw-r-----),目录750(drwxr-x---) -
umask 077→ 文件600(-rw-------),目录700(drwx------)
⚠️ 错误写法:umask 22(无前导零)会被解释为十进制 22 → 八进制 026,结果不可控。
验证是否生效:
touch testfile && mkdir testdir ls -ld testfile testdir
永久设置(按场景选对位置)
单用户生效(推荐开发机/个人环境)
编辑对应 shell 的初始化文件(先查 echo $SHELL):
- Bash 用户:
~/.bashrc或~/.profile(GUI 终端更可能读~/.profile) - Zsh 用户:
~/.zshrc - Fish 用户:
~/.config/fish/config.fish
添加一行:
umask 002
然后运行:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
source ~/.bashrc # 或对应文件
所有新用户生效(服务器部署首选)
修改 /etc/login.defs:
sudo nano /etc/login.defs
确保有未注释行:
UMASK 027
该设置只影响 useradd 创建的新用户首次登录。
覆盖 su/sudo/cron/systemd 等非标准登录(生产必须配)
PAM 是唯一可靠方式:
Debian/Ubuntu:在
/etc/pam.d/common-session末尾加session optional pam_umask.so umask=0027RHEL/CentOS:在
/etc/pam.d/system-auth的session段加同上行
若提示 pam_umask.so 不存在,先安装:
sudo apt install libpam-umask # Ubuntu/Debian sudo yum install pam-devel # RHEL/CentOS(旧版需编译或找包)
特殊场景补救(配置写了却没用?)
-
IDE、VS Code、Git、npm 创建的文件不受 umask 控制
因为它们不走 shell 初始化流程,而是直接解压或复制预设权限(如 git blob 固定为100644)。
补救:- Git 仓库设
git config core.sharedRepository group - CI 脚本开头显式写
umask 002 - 共享目录用
setfacl -d -m g:groupname:rwx /path配合 ACL(需 ext4/xfs)
- Git 仓库设
-
Cron 任务、systemd service、Docker 容器
默认不加载任何 shell 配置。必须在脚本或 entrypoint 第一行写:#!/bin/bash umask 002 ...
常见误区澄清
- umask
000≠ 文件带 x 权限 → 内核强制过滤,新建普通文件永远无x -
umask 022计算不是666 - 022 = 644,而是666 & (~022),但结果一致;减法可作速算,但本质是位运算 - 只改
~/.bashrc,但终端启动的是非登录 shell(如 GNOME Terminal 默认)→ 改~/.profile更稳妥 - 修改后只
umask命令显示正确 ≠ 实际创建有效 → 务必touch && ls -l实测
不复杂但容易忽略。

















