进程的文件创建掩码(umask)会阻止该进程创建文件系统对象时设置选定的权限位。它是掩码,不是一套完整默认模式:应用程序先请求一个模式,内核再移除 umask 禁止的权限位。
从概念上说:
结果模式 = 请求模式 AND NOT umask
权限 · 第 4 课
学习进程 umask 如何限制新建文件和目录所请求的权限位。
进程的文件创建掩码(umask)会阻止该进程创建文件系统对象时设置选定的权限位。它是掩码,不是一套完整默认模式:应用程序先请求一个模式,内核再移除 umask 禁止的权限位。
从概念上说:
结果模式 = 请求模式 AND NOT 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 查看或设置当前 shell 的掩码。
从应用程序请求的模式中移除被掩蔽的位。
区分普通文件常请求的 0666 和目录常请求的 0777。
把 umask 的作用范围和持久性视为特定于进程及环境的行为。