Umask
100%

权限 · 第 4 课

Umask

学习进程 umask 如何限制新建文件和目录所请求的权限位。

进程的文件创建掩码(umask)会阻止该进程创建文件系统对象时设置选定的权限位。它是掩码,不是一套完整默认模式:应用程序先请求一个模式,内核再移除 umask 禁止的权限位。

从概念上说:

结果模式 = 请求模式 AND NOT umask

访问控制列表和应用程序行为还可能增加更多细节,因此准确权限很重要时应检查结果。

查看和设置 Umask

运行不带操作数的 umask,显示当前 shell 的掩码,通常采用八进制形式:

$ umask
0022

为当前 shell 及之后由该 shell 启动的进程设置它:

$ umask 027

每个八进制位置分别对应所有者、组和其他。掩码位会移除相应的已请求权限:2 掩蔽写入,4 掩蔽读取,1 掩蔽执行。

umask 027 会在当前 shell 中更改什么?

计算新文件和目录模式

许多普通程序为新普通文件请求 0666,因为默认创建可执行文件并不安全。它们通常为新目录请求 0777,目录需要执行权限才能遍历。

使用 umask 0022 时:

普通文件:0666 由 0022 掩蔽 -> 0644 (rw-r--r--)
目录:    0777 由 0022 掩蔽 -> 0755 (rwxr-xr-x)

umask 只会移除已请求的权限位。如果应用程序没有请求执行权限,它不能添加该权限。应用程序也可以请求更严格的起始模式,从而产生更严格的结果。

如果程序为普通文件请求模式 0666,umask 为 0022,结果是哪种模式?

如果程序为目录请求 0777,umask 为 0027,结果是哪种模式?

作用范围和持久性

在一个 shell 中更改 umask,不会改变其父进程或无关会话。该值适用于该 shell 及其后代之后创建的对象;现有文件会保留自身模式。

要持久使用首选值,应在适合当前环境的登录、shell、PAM、服务管理器或应用程序配置中设置它。正确位置各不相同,服务也可能自行设置 umask。不要假设编辑一个交互式 shell 文件就能控制系统中的每个进程。

设置新的 umask 时,现有文件会发生什么?

要动手练习,请在隔离环境中使用不同掩码创建文件和目录,再用 ls -ld 比较模式。Linux 用户组和文件权限 实验提供了合适的权限工作区。

课程已完成

你已完成 Umask

现在,你可以预测 umask 如何限制新请求的权限。

  • 使用 umask 查看或设置当前 shell 的掩码。

  • 从应用程序请求的模式中移除被掩蔽的位。

  • 区分普通文件常请求的 0666 和目录常请求的 0777

  • 把 umask 的作用范围和持久性视为特定于进程及环境的行为。

保存学习进度

创建免费账户即可保存本课进度,并在任意设备上继续学习。

创建免费账户
下一节
返回 权限