很多初学者刚接触 Linux 权限时,都搞不懂 umask 存在的意义,明明可以直接设定文件目录权限,为何还要多一层掩码计算?其实这是 Unix 系系统经典的权限设计思路,umask 凭借灵活可调的特性,适配不同使用场景的权限需求,本期文章带大家全面吃透 umask。

1.什么是umask

umask 是用户文件权限掩码,作用是控制新建文件 / 目录的默认权限


系统创建文件、文件夹时,并不是直接给满权限,而是用「系统默认最大权限 - umask 掩码」算出最终权限。

普通用户默认 umask 0022


root 默认 umask 0022 或 0027

第一位是特殊权限位,后三位才是常规权限掩码

2.为什么会存在umask

了解文件权限的伙伴都知道:

目录默认最大权限:777(rwxrwxrwx)
普通文件默认最大权限:666(rw-rw-rw-)

终权限计算公式:
目录权限 = 777 - umask
文件权限 = 666 - umask

为什么目录的默认最大权限是777,而文件的默认最大权限是666?

文件天生不需要执行权限,目录天生必须要有执行权限,所以内核硬写死了创建初始基准权限

为什么会有“默认”这两个关键字呢?为什么不在文件创建的时候直接进给定终极权限?

1. 权限场景不是固定一成不变
        1.内网开发机、多人共享目录:适合 0002(775/664),同组可读写
        2.生产服务器、安全严苛环境:要更严格,比如 0027
        3.目录 750、文件 640,其他用户完全没权限,防止泄密越权
        4.个人单机自用:甚至可以更宽松
如果系统写死默认就是 775/664,无法一键切换全局安全等级。
2. 系统要兼容多用户、多发行版、多环境
        1.Linux 是通用内核,要适配
                1.个人桌面
                2.企业服务器
                3.嵌入式设备
                4.多用户集群
固定死权限 = 失去灵活性,用 umask 只改一个数字,全局新建文件目录权限全部批量切换,不用改系统源码、不用改内核默认值。
3. 历史设计逻辑:基准最大权限 + 掩码收权
        1.Unix 最初设计思路
                先给理论最大开放权限:目录 777、文件 666
                再用 umask 减掉不该有的权限做安全收缩
        这种减法设计更符合安全思路:
        默认全开,按需收权,而不是默认定死,再逐个加权限
4. 区分「用户级」和「全局级」权限策略
        1.普通用户:默认 0022 → 755/644
        2.管理员 / 特定用户:可自行改成 0002(775/664)共享模式
        3.运维加固:统一改成 0027 严格模式
每个人、每个业务、每台服务器可以独立定义默认权限,不用统一一刀切 775/664。
5. 程序自动创建文件无法硬编码权限
大量后台程序、日志服务、编译工具、定时任务创建文件时,不会内置写死 775/664。
它们统一遵循系统umask 规则,由环境变量统一控制,适配所有业务场景。


一句话总结:直接固定 775/664 是写死标准答案,umask 是给你一套可自由调节的权限标尺

3.最终权限计算原理

无论是目录还是文件,他们最终权限的计算本质是通过位运算来实现的

真实底层运算:

1.默认最大权限

2.把umask按位取反~

3.umask按位取反后再与默认最大权限按位与&

下面我们看看到底是怎么运算的

4.umask的修改

在对umask进行修改时,有两种形式:暂时性修改永久性修改

暂时性修改:

永久性修改:

4.总结

Linux 不直接定死 775 与 664,是为了用一把 umask 标尺,适配从个人开发到企业生产所有安全权限场景。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐