关于本文
本文是通过利用生成式 AI 的自动化流程创建的。在确认 Linux 文件权限和 umask 的公开规范的同时,在临时目录中安全地观察差异,并整理其在服务运营中的意义。验证状态:📘 已确认规范・尚未执行
umask 022 和 077 往往容易被死记硬背,但重要的是理解它是一个决定 新创建的文件或目录从一开始就不应赋予哪些权限的机制。
首先尝试
d=$(mktemp -d) cd "$d" umask 022 touch a.txt stat -c '%a %n' a.txt
通常情况下如下所示。
644 a.txt
接下来进行更改。
umask 077 touch b.txt stat -c '%a %n' b.txt
这次通常会变成
600 b.txt
。
并非简单的“666 – 022”减法运算
虽然说明中有时会写作 666 - 022 = 644,但 umask 的本质不是算术减法,而是 从允许位中剔除被屏蔽的位。
由于普通文件从一开始就不附加执行位,因此基准主要为 666,而目录的基准则为 777。
flowchart LR A[作成時の基準mode] --> B[umaskで禁止bitを落とす] B --> C[実際の初期mode]
目录的结果有所不同
umask 022 mkdir dir022 umask 077 mkdir dir077 stat -c '%a %n' dir022 dir077
通常可以观察到 755 与 700 的差异。
也就是说,umask 不仅对普通文件有效,对新建目录也同样有效。
与 chmod 的区别
umask: 影响将要新建的内容的初始权限chmod: 更改已有内容的 mode
umask 077即使更改为 644,现有的 600 文件也不会自动变成
。
如何在实际工作中应用
备份文件
临时文件
保存 API 响应
密钥或配置文件
批处理输出日志
服务生成的工作文件
例如,如果在处理开始时明确指定 umask 077,则可以将该进程创建的文件置于其他用户难以读取的初始状态。
Shell 中确认的 umask 与服务的 umask 并不一定相同
systemd 服务、cron、容器以及应用程序自身可能会设置不同的 umask。
切勿认为“我的 SSH 会话是 077,所以服务也应该是 077”,而是应该 实际确认是在哪个执行上下文中创建文件的。
在 systemd 中,有时可以通过单元设置中的 UMask= 来明确指定。
注意事项
并不是把 umask 设得越严就越好。如果用 077 创建多个用户或组共享的文件,有时反而会妨碍必要的协作。
在实际工作中,应先确定以下几点再选择数值:
谁需要读取
谁需要写入
是否应从新建时起就进行限制
是否需要群组共享
。
收尾工作
cd / rm -rf "$d"
总结
umask 控制新建时的初始权限
与 chmod 的职责不同
普通文件和目录的基准 mode 不同
服务的 umask 有时会与 shell 不同
对于包含机密信息的生成物,明确设置 umask 有助于防止事故
