umask
掩码工具用于控制文件创建模式掩码,它决定新创建文件的文件权限位的初始值。这个工具的行为是由 POSIX 标准化,并在 POSIX 开发者手册中描述。因为掩码值会影响当前的 shell 执行环境,所以它通常作为 shell 的内置命令实现。
模式掩码的含义[编辑 | 编辑源代码]
模式掩码包含在新创建的文件上不应该设置的权限位,因此它是在新创建的文件上设置的权限位的逻辑非。如果掩码值中的某些位被设置为1
,新创建文件的相应权限将被禁用。因此,掩码值就像一个过滤器,可以剥离权限位,有助于设置文件的默认访问权限。
在新创建的文件上设置权限位的结果是用位法实质非蕴涵(也称为否定)计算的,可以用逻辑符号表示。
R: (D & (~M))
也就是说,产生的权限 R
是默认权限 D
的位与和文件创建模式屏蔽 M
的位非的结果。
- Linux 不允许以执行权限创建文件,目录的默认创建权限为
777
,文件的默认创建权限为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 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
参见[编辑 | 编辑源代码]
- POSIX 开发者手册:
- 掩码值(可在 umask(1p) 阅读)
- chmod(扩展说明)(可在 chmod(1p) 阅读)
- 027 掩码值:安全和简单的折中方案