Linux 下的 umask 介绍

shell

Linux 为创建文件和目录分别提供了默认权限:

文件类型 权限
普通文件 666 (rw-rw-rw-)
目录 777 (rwxrwxrwx)

而且我们可以灵活地通过 umask 调整创建时候的文件权限。这个时候就要用到 umask 来设置了。
umask 命令是 Linux 用来设置用户默认创建文件权限的命令。umask 中文名可以叫“用户掩码”,实际上,umask 描述的是你不想给该文件的权限,在创建的时候会通过 umask 从默认权限中屏蔽所设置的权限,比如说:
我的 umask = 022(—-w–w-),而普通文件为 666(rw-rw-rw-),通过 umask 屏蔽后变成了=>644(rw-r–r–),这样就使得文件创建更加灵活。可以说,文件的实际权限=默认权限-用户掩码。
显然 644 相对于 666 来说更安全,允许文件所有者控制,同时允许其他用户读取文件但不能修改文件内容。

在 shell 中可以通过 umask 命令来检查当前的用户掩码输出为八进制位,比如: 022。
除此之外,有 umask -S 以符号的形式进行输出,而且是帮我们进行了处理:比如 022 在使用 umask -S 后输出为:

1
u=rwx,g=rx,o=rx

系统调用

umask 不仅在 shell 中存在,而且还是 Linux 下的一个系统调用。在 C 程序里面,设置的 umask 是该程序的 umask。在 Linux 下每一个进程都对于一个 umask。umask() 使用位来保存信息,因而可以使用位运算来处理。(要注意的是 umask() 在 <sys/stat.h> 头文件中)
比如我们首先用宏定义 RWRWRW 作为默认创建的权限:

1
#define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)

在这里定义的权限为 666。
在接下来我们首先尝试 umask(0) 然后用 creat() 来创建文件:

1
2
    umask(0);
    if (creat("foo", RWRWRW) < 0) printf("Creat error for foo\n");

在程序运行之后检查发现 foo 的权限为 rw-rw-rw,显然因为 umask 为 0,创建文件完全按照 RWRWRW 所规定的权限,显然因为 umask 为 0,创建文件完全按照 RWRWRW 所规定的权限。

接下来我们在 umask() 中填写掩码,可以用在 stat.h 中存储的权限常量通过 | 累加操作:

1
2
    umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
    if (creat("bar", RWRWRW) < 0) printf("creat error for bar\n");

这里的 umask 对应为 066,程序运行完后 bar 权限为 rw——- (600) 符合预期。
默认情况下,进程的 umask 继承自 shell。也就是说,子进程会从父进程中继承其的 umask。

萌ICP备20241614号