umask

来自 Arch Linux 中文维基

掩码工具用于控制文件创建模式掩码,它决定新创建文件的文件权限位的初始值。这个工具的行为是由 POSIX 标准化,并在 POSIX 开发者手册中描述。因为掩码值会影响当前的 shell 执行环境,所以它通常作为 shell 的内置命令实现。

模式掩码的含义[编辑 | 编辑源代码]

模式掩码包含在新创建的文件上不应该设置的权限位,因此它是在新创建的文件上设置的权限位的逻辑非。如果掩码值中的某些位被设置为1,新创建文件的相应权限将被禁用。因此,掩码值就像一个过滤器,可以剥离权限位,有助于设置文件的默认访问权限。

在新创建的文件上设置权限位的结果是用位法实质非蕴涵(也称为否定)计算的,可以用逻辑符号表示。

R: (D & (~M))

也就是说,产生的权限 R 是默认权限 D位与和文件创建模式屏蔽 M位非的结果。

注意:
  • Linux 不允许以执行权限创建文件,目录的默认创建权限为777,文件的默认创建权限为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=

设置掩码值[编辑 | 编辑源代码]

注意: 可以根据具体情况设置掩码值。例如,桌面用户可能会发现对其主文件夹的限制权限已足够(useradd -m 默认创建具有 700 权限的目录),因为其他人无法访问其中的所有文件。如果这不切实际(例如,在使用 Apache HTTP Server 时),并且公共文件存储在私有文件中,那么请考虑限制掩码值。

可以通过 umask 命令设置掩码值。指定模式掩码的字符串遵循与 chmod 的模式参数相同的语法规则(详见 POSIX 开发者手册)。

全系统的掩码值可以在 /etc/profile 或默认的 shell 配置文件中设置,比如 /etc/bash.bashrc。大多数 Linux发行版,包括 Arch,都将掩码值的默认值设置为022。(见 /etc/profile)。也可以用 pam_umask.so设置掩码值,但它可能被 /etc/profile 或类似文件覆盖。

如果需要设置不同的值,可以直接编辑该文件,从而影响所有用户,或者从 shell 的用户配置文件中调用 umask,例如 ~/.bashrc,只修改你的掩码值,但这些修改只在下次登录后生效。要想只在当前会话中改变掩码值,只需运行 umask 并输入你想要的值。例如,运行 umask 077 会给你新文件的读写权限,以及新文件夹的读写和执行权限。

设置 KDE / Plasma 的掩码值[编辑 | 编辑源代码]

通过 /etc/profile 设置掩码值对 KDE / Plasma 会话不再有效,因为这些会话是以 systemd 用户单元的形式启动。

掩码值可以通过 pam_umask.so 或 systemd 的附加配置片段设置。

/etc/systemd/system/user@.d/override.conf
[Service]
UMask=0002

使用 pam_umask.so 可以在一个环境为文本控制台和图形 KDE 会话设置全系统的掩码值。在 /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

参见[编辑 | 编辑源代码]