资讯详情

【Linux】 权限篇(三):深入理解 umask 位运算与粘滞位的设计思想

📅 2026/10/23 4:57:43 | 华诺云谱 👁 阅读
【Linux】 权限篇(三):深入理解 umask 位运算与粘滞位的设计思想
一、引言Linux 为什么要控制默认权限在前两篇中我们学习了 Linux 的文件属性、基本权限以及如何使用chmod、chown和chgrp修改权限。但还有两个问题值得继续思考使用touch创建一个文件时我们没有指定权限为什么文件仍然会自动获得一组权限在一个允许所有用户写入的公共目录中为什么用户可以创建自己的文件却不应该随意删除其他用户的文件第一个问题涉及umask新建文件和目录的默认权限如何产生。第二个问题涉及Sticky Bit粘滞位如何在允许共享的同时限制删除行为。这两个知识点看似独立实际上体现了 Linux 权限设计的两个目标创建资源时默认权限不能过度开放。共享资源时不能只考虑协作便利还要考虑资源保护。二、umask新建文件的权限是怎么来的2.1 先观察一个现象在 Ubuntu 终端中执行umask假设输出0002这表示当前 Shell 的文件创建权限掩码为0002。接下来创建一个文件和一个目录touchtest.txtmkdirtest_dirls-ltest.txtls-ldtest_dir在没有其他权限机制干预的常见情况下可以观察到-rw-rw-r-- test.txt drwxrwxr-x test_dir对应的权限数字分别是test.txt - 664 test_dir - 775问题来了我们没有执行chmod为什么它们会得到这些权限原因是创建文件和目录时程序会向操作系统提出创建请求并提供一个期望的初始权限模式。内核再结合当前进程的umask等权限规则确定新对象的权限。因此umask不是事后修改权限的命令而是影响新建文件和目录默认权限的掩码。2.2 先回顾 rwx 的数字表示Linux 使用三位二进制位表示一组基本权限权限二进制八进制数值r1004w0102x0011每个文件通常分别设置拥有者、所属组和其他用户的权限。例如-rw-rw-r--拆分为rw- rw- r-- 用户 用户组 其他用户对应664其中用户拥有读、写权限4 2 6用户组拥有读、写权限4 2 6其他用户只有读权限4理解了这个基础才能继续理解umask为什么能够屏蔽权限。2.3 文件和目录的起始权限为什么不同在常见的 Linux 文件创建机制中用于计算默认权限的基础模式通常是对象类型基础模式含义普通文件666rw-rw-rw-目录777rwxrwxrwx这里的基础模式不是说最终创建出来的文件一定具有这些权限而是计算时使用的基础值。为什么普通文件的基础模式不是777因为普通文件默认不应自动获得执行权限。一个刚刚创建的文本文件通常只是数据不应该仅仅因为它被创建出来就默认成为可执行文件。目录则不同目录的x权限与进入、搜索目录有关因此目录的基础模式通常包含执行权限。注意程序可以请求不同的创建模式文件系统也可能受到 ACL 等机制影响。因此这里的666和777是理解常见默认权限计算的基础模式不代表所有创建操作都必然采用它们。三、umask 的核心不是减法而是位运算3.1 umask 究竟屏蔽了什么可以先记住一句话umask中对应权限位为1的位置表示该权限位不应出现在最终权限中。例如umask 0002最后一位的八进制数字2对应二进制010它代表屏蔽其他用户权限组中的写权限位。于是新建文件时基础模式中的其他用户写权限就会被屏蔽。这也解释了为什么umask 0002通常会让新建文件的权限从666变为664。3.2 为什么公式是 mode ~umask常见的权限计算表达式为final_moderequested_mode~umask;这里涉及两个位运算符~按位取反。按位与。先看按位与的规则ABA B000010100111按位与的核心特点是只有两边都为1结果才是1。因此如果我们希望某个权限位被保留就需要让基础模式和掩码取反后的对应位都为1。如果掩码中的某个权限位是1取反之后就会变成0。基础模式与这个0进行按位与结果只能是0对应权限便被屏蔽了。这就是umask的底层逻辑。3.3 手动推导umask 0002先看新建目录。基础模式777 111 111 111掩码002 000 000 010取反后只保留我们需要讨论的低九个权限位~002 111 111 101执行按位与111 111 111 777目录基础模式 111 111 101 ~002屏蔽写权限位 ------------- 111 111 101 775最终权限因此777 ~002 775再看普通文件。110 110 110 666文件基础模式 111 111 101 ~002 ------------- 110 110 100 664最终权限因此666 ~002 664这里的二进制演算只展示权限所使用的九个基本权限位。实际计算机中的按位取反还会涉及更高位所以不能把无限位宽的~002直接理解为一个只有九位的数我们展示的是权限位范围内的结果。3.4 为什么不能直接做减法看到666 - 002 664 777 - 002 775你可能会觉得直接相减不就行了吗但这只是部分例子中碰巧得到相同结果不能作为通用算法。原因在于umask表示的是需要屏蔽哪些权限位而不是需要从权限数字中减去多少。例如基础模式666 umask 022正确结果666 ~022 644如果用普通减法666 - 022 644这次结果相同。但再看基础模式666 umask 003按照位屏蔽规则003表示屏蔽其他用户组的写权限和执行权限对应的位。普通文件基础模式666本身没有执行权限因此屏蔽执行权限不会产生额外变化。屏蔽其他用户的写权限后最终权限为664。而直接做八进制减法666 - 003 663得到的结果反而让其他用户失去了读权限并没有正确表达“屏蔽写和执行权限”的含义。结论权限掩码操作的是二进制权限位因此必须按照位运算规则理解不能将其等同于数字减法。四、在 Ubuntu 中验证 umask4.1 查看当前掩码umask如果想看到符号形式可以执行umask-S输出形式可能类似urwx,grwx,orx具体输出以当前 Shell 环境为准。4.2 临时修改掩码可以在当前终端中执行umask0002然后创建测试对象touchumask_filemkdirumask_dirls-lumask_filels-ldumask_dir在常见默认创建模式下预期分别为-rw-rw-r-- umask_file drwxrwxr-x umask_dir对应664 775如果你想验证不同掩码的效果可以尝试umask0022touchfile_0022mkdirdir_0022ls-lfile_0022ls-lddir_0022常见结果file_0022 - 644 dir_0022 - 755再尝试umask0077touchprivate_filemkdirprivate_dirls-lprivate_filels-ldprivate_dir常见结果private_file - 600 private_dir - 700这时新建文件只有拥有者能够读写新建目录只有拥有者具有完整的基本权限。4.3 umask 修改后会永久生效吗通常不会。直接执行umask0077会修改当前 Shell 的掩码当前 Shell 创建的子进程通常也会继承相应的掩码状态。退出该 Shell 后重新登录时的掩码可能由启动配置重新设置。如果确实需要长期修改可以根据自己的 Shell 环境在对应的用户启动配置文件中设置。但在学习阶段建议先在当前终端实验不要随意修改全局配置。特别注意不要在不理解影响范围的情况下把严格或过于宽松的umask设置写进系统级配置。五、从默认权限转向共享目录出现了什么矛盾理解umask后我们再看第二个问题。假设一台 Linux 服务器上有多个普通用户他们都需要在一个公共目录中创建临时文件。如果公共目录不允许其他用户写入那么协作就会受限。但如果为了方便协作直接允许所有用户读、写、进入这个目录又会带来新的问题用户可能删除自己并不拥有的文件。这里有一个很容易误解的知识点删除目录中的文件通常主要检查的是父目录的权限而不是被删除文件本身的写权限。5.1 为什么删除文件看的是目录权限例如目录结构如下/shared/ └── alice.txt假设/shared允许某个用户写入并搜索。alice.txt属于 Alice。该用户不是 Alice也不是 root。即使alice.txt本身没有授予该用户写权限如果该用户对父目录具有足够的权限且没有其他限制仍然可能删除这个目录项。为什么从文件系统的角度看删除文件并不等同于打开文件并修改内容。删除操作需要修改的是父目录中的目录项也就是让目录不再记录这个文件名与对应对象之间的关联。因此修改文件内容主要检查文件自身的写权限。删除或重命名目录中的条目主要检查父目录的写权限和搜索权限。这就是为什么“文件不可写”并不一定意味着“文件不可删除”。5.2 用流程图理解删除权限否是否是是否用户尝试删除文件检查父目录权限是否具有必要的写权限和搜索权限通常拒绝操作是否存在粘滞位等额外限制通常允许删除目录项继续检查删除者身份是否为允许删除的用户允许删除拒绝删除这个流程是帮助理解的简化模型。实际操作还可能受到 ACL、只读挂载、文件系统属性等因素影响。现在问题就明确了我们希望用户可以在公共目录中创建自己的文件但不能随意删除别人的文件。这正是粘滞位要解决的核心问题。六、Sticky Bit让公共目录既能共享又能保护文件6.1 什么是粘滞位Sticky Bit中文通常称为“粘滞位”是一种特殊权限位。在现代 Linux 中它最常见的用途是保护设置了该权限的共享目录。当目录设置了粘滞位后即使用户对目录拥有写权限也不能因此随意删除或重命名其他用户的文件。在典型的目录场景中允许删除目录项的身份包括文件的拥有者。目录的拥有者。超级用户 root。当然操作仍然需要满足其他适用的权限与系统规则。6.2 粘滞位在权限字符串中如何显示观察一个常见的权限字符串drwxrwxrwt最后的t就是粘滞位的标志。普通目录权限的最后一位通常对应其他用户的执行权限设置粘滞位后如果其他用户执行权限也存在通常显示为小写t。如果其他用户执行权限不存在则通常显示为大写T。例如drwxrwxrwt drwxrwxrwT这两个字符串都体现了粘滞位但对应的执行权限情况不同。6.3 为什么/tmp通常有粘滞位Linux 系统中的/tmp通常用于存放临时文件。多个程序、多个用户可能同时使用这个目录因此它需要允许不同用户创建临时文件。可以查看ls-ld/tmp常见输出类似drwxrwxrwt ... /tmp重点看末尾的t。/tmp通常具有所有者的完整权限。所属组和其他用户的读、写、执行权限。粘滞位。这意味着普通用户可以在其中创建临时文件但不能仅仅因为目录可写就随意删除其他用户拥有的文件。因此/tmp展示了一种典型的权限设计思路允许共享目录本身同时对目录项的删除和重命名增加身份限制。七、如何设置粘滞位7.1 使用符号方式假设我们创建一个用于实验的目录mkdirsticky_demochmod777sticky_demols-ldsticky_demo此时权限通常类似drwxrwxrwx ... sticky_demo设置粘滞位chmodt sticky_demo再次查看ls-ldsticky_demo预期看到drwxrwxrwt ... sticky_demo最后的t表示粘滞位已设置。这里使用的是自己创建的实验目录不需要修改系统目录也不需要执行危险的全局权限修改。7.2 使用数字方式Linux 也支持使用特殊权限位的数字表示。粘滞位对应的数值为1写在普通三位权限数字之前。例如chmod1777sticky_demo其中1 777 │ └── 普通权限rwxrwxrwx └──── 粘滞位执行后目录的权限通常会显示为drwxrwxrwt需要注意特殊权限位与普通的rwx权限位属于不同的概念不要把1777理解成四组普通读写执行权限。八、umask 和粘滞位有什么本质区别这两个知识点都与 Linux 权限有关但它们解决的是不同阶段的问题。对比项umaskSticky Bit主要作用控制新建对象的默认权限限制共享目录中的删除、重命名行为主要生效时机创建文件或目录时对设置了粘滞位的目录进行相关操作时关注对象新建对象的基本权限位目录中的文件条目及相关用户身份常见使用方式umask 0022chmod t directory典型场景避免新建文件默认过度开放保护/tmp一类共享目录中的文件可以这样理解umask关注的是一个对象刚创建出来时默认应该开放哪些权限粘滞位关注的是一个目录允许多人共同使用时谁可以删除其中的文件一个控制创建阶段的默认权限一个在共享目录场景中增加删除与重命名的限制。二者互不替代。九、常见误区总结误区一umask 是从默认权限中直接减去一个数字错误。umask表示需要屏蔽的权限位。应从位运算角度理解最终权限 请求的基础权限 ~umask误区二新建文件一定是 666新建目录一定是 777不准确。它们是常见计算场景中的基础模式。最终权限还取决于创建请求、umask以及可能存在的其他权限机制。误区三文件没有写权限就一定不能删除错误。删除文件通常主要检查父目录的写权限和搜索权限设置粘滞位后还需要检查相关用户身份。误区四目录有粘滞位就不能删除里面的文件错误。粘滞位并不是禁止所有删除操作而是限制哪些用户可以删除或重命名目录中的条目。文件拥有者、目录拥有者和 root 通常仍然可以删除符合条件的文件。误区五只要设置了粘滞位其他权限就不重要了错误。粘滞位不会代替目录的基本权限检查。用户仍然需要满足适用的访问条件粘滞位是在相关权限检查之外增加的一层限制。十、总结本篇学习了 Linux 权限管理中的两个重要机制。第一umask通过屏蔽权限位影响新建文件和目录的默认权限。理解它的关键不是记住几个数字而是理解按位取反与按位与的运算逻辑。第二Sticky Bit 用于解决共享目录中的权限矛盾。它允许用户在公共目录中协作同时限制普通用户随意删除或重命名其他用户的文件。回到最初的两个问题为什么新建文件会自动获得一组权限因为创建请求的基础权限会受到umask等规则的影响。为什么公共目录可以允许多人写入却又保护其他人的文件因为粘滞位能够在共享目录中增加身份方面的限制。Linux 权限管理并不是简单地给文件设置几个rwx标志而是围绕资源访问、默认安全性和多用户协作建立起来的一套机制。当我们能够从“为什么需要这条规则”出发再推导它的行为就不再只是记住命令而是在理解操作系统的设计思想。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑