umask

出自 ArchWiki

umask 实用程序用于控制文件创建模式掩码,该掩码决定了新创建文件的文件权限位的初始值。此实用程序的行为由 POSIX 标准化,并在 POSIX 程序员手册 中描述。由于 umask 影响当前的 shell 执行环境,它通常作为 shell 的内置命令实现。

模式掩码的含义

模式掩码包含不应在新创建的文件上设置的权限位,因此它是新创建的文件上设置的权限位的逻辑补码。如果掩码中的某些位设置为 1,则将禁用新创建文件的相应权限。因此,掩码充当过滤器以剥离权限位,并有助于设置文件的默认访问权限。

要设置在新创建文件上的权限位的最终值,使用按位实质非蕴含(也称为反蕴涵),可以用逻辑符号表示为

R: (D & (~M))

也就是说,结果权限 R 是默认权限 D 和文件创建模式掩码 M按位取反按位与的结果。

注意
  • 目录的默认创建权限为 777
  • 由于 Linux 不允许创建具有执行权限的文件,因此文件的默认创建权限仅为 666
  • 在 Linux 下仅使用掩码的文件权限位 - 请参阅 umask(2)。掩码的 suidsgidsticky 位将被忽略。

例如,假设文件创建模式掩码为 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=

设置掩码值

此文章或章节已过时。

原因: Arch 不使用 /etc/profile 设置默认 umask,请参阅新闻。本节需要相应地更新。(在Talk:Umask中讨论)
注意: Umask 值可以根据具体情况设置。例如,桌面用户可能会发现其主文件夹上的受限权限就足够了(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

参见