umask
umask 实用程序用于控制文件创建模式掩码,该掩码决定了新创建文件的文件权限位的初始值。此实用程序的行为由 POSIX 标准化,并在 POSIX 程序员手册 中描述。由于 umask 影响当前的 shell 执行环境,它通常作为 shell 的内置命令实现。
模式掩码的含义
模式掩码包含不应在新创建的文件上设置的权限位,因此它是新创建的文件上设置的权限位的逻辑补码。如果掩码中的某些位设置为 1
,则将禁用新创建文件的相应权限。因此,掩码充当过滤器以剥离权限位,并有助于设置文件的默认访问权限。
要设置在新创建文件上的权限位的最终值,使用按位实质非蕴含(也称为反蕴涵),可以用逻辑符号表示为
R: (D & (~M))
也就是说,结果权限 R
是默认权限 D
和文件创建模式掩码 M
的按位取反的按位与的结果。
- 目录的默认创建权限为
777
。 - 由于 Linux 不允许创建具有执行权限的文件,因此文件的默认创建权限仅为
666
。 - 在 Linux 下仅使用掩码的文件权限位 - 请参阅 umask(2)。掩码的 suid、sgid 和 sticky 位将被忽略。
例如,假设文件创建模式掩码为 027
。这里,每个数字的按位表示代表
0
代表新创建的文件上未设置的用户权限位2
代表新创建的文件上未设置的组权限位7
代表新创建的文件上未设置的其他权限位
根据下表提供的信息,这意味着对于新创建的文件,例如由 User1
用户和 Group1
组拥有的文件,User1
拥有新创建文件的所有可能权限(八进制值 7
),Group1
组的其他用户没有写入权限(八进制值 5
),任何其他用户对新创建的文件没有任何权限(八进制值 0
)。因此,对于此示例中采用的 027
掩码,创建的文件将具有 750
权限。
八进制 | 二进制 | 含义 |
---|---|---|
0 |
000 |
无权限 |
1 |
001 |
仅执行 |
2 |
010 |
仅写入 |
3 |
011 |
写入和执行 |
4 |
100 |
仅读取 |
5 |
101 |
读取和执行 |
6 |
110 |
读取和写入 |
7 |
111 |
读取、写入和执行 |
显示当前掩码值
要显示当前掩码,只需在不指定任何参数的情况下调用 umask
。默认输出样式取决于实现,但通常是八进制
$ umask
0027
当使用 POSIX 标准化的 -S
选项时,掩码将使用符号表示法显示。但是,符号表示法值将始终是八进制值的逻辑补码,即要设置在新创建文件上的权限位
$ umask -S
u=rwx,g=rx,o=
设置掩码值
useradd -m
默认使用 700
权限创建目录),因为它们使其他用户无法访问其中的所有文件。如果这不切实际(例如,当使用 Apache HTTP 服务器时),并且公共文件与私有文件存储在一起,则请考虑限制 umask。您可以通过 umask 命令设置 umask 值。指定模式掩码的字符串遵循与 chmod 的模式参数相同的语法规则(有关详细信息,请参阅POSIX 程序员手册)。
系统范围的 umask 值可以在 /etc/profile
(例如 /etc/profile.d/umask.sh
)或默认 shell 配置文件(例如 /etc/bash.bashrc
)中设置。大多数 Linux 发行版,包括 Arch,在 /etc/login.defs
中设置了 022
的 umask 默认值。也可以使用 pam_umask.so
设置 umask,但它可能会被 /etc/profile
或类似文件覆盖。
如果需要设置不同的值,您可以直接编辑此类文件,从而影响所有用户,或者从 shell 的用户配置文件(例如 ~/.bashrc
)中调用 umask
以仅更改您的 umask,但是这些更改仅在下次登录后才会生效。要仅在当前会话期间更改您的 umask,只需运行 umask
并键入您想要的值。例如,运行 umask 077
将为您提供新文件的读写权限,以及新文件夹的读取、写入和执行权限。
正如 pam_umask(8) § DESCRIPTION 所述,umask=value
也可以在 用户和组#用户数据库 的 /etc/passwd
部分中使用。请参阅关于在 GECOS 字段中设置 UMASK 的讨论
为 KDE / Plasma 设置 umask 值
通过 /etc/profile
设置 umask 值不再适用于 KDE / Plasma 会话,因为这些会话作为 systemd 用户单元 启动。
umask 值可以通过 pam_umask.so
或 systemd drop-in 文件 设置
/etc/systemd/system/user@.service.d/override.conf
[Service] UMask=0002
使用 pam_umask.so
允许在一个位置为文本控制台和图形 KDE 会话设置系统范围的 umask 值。可以省略 /etc/profile
或 systemd 配置中的任何更改。因此,需要在 /etc/pam.d/login
和 /etc/pam.d/systemd-user
都包含的配置文件中启用 pam_umask.so
。
将以下行添加到 /etc/pam.d/system-login
# session optional pam_umask.so umask=022
参见
- POSIX 程序员手册
- umask (也可作为 umask(1p) 使用)
- chmod(扩展描述) (也可作为 chmod(1p) 使用)
- 027 umask:安全性和简易性之间的折衷