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
后输出为:
|
|
系统调用
umask 不仅在 shell 中存在,而且还是 Linux 下的一个系统调用。在 C 程序里面,设置的 umask 是该程序的 umask。在 Linux 下每一个进程都对于一个 umask。umask() 使用位来保存信息,因而可以使用位运算来处理。(要注意的是 umask() 在 <sys/stat.h> 头文件中)
比如我们首先用宏定义 RWRWRW 作为默认创建的权限:
|
|
在这里定义的权限为 666。
在接下来我们首先尝试 umask(0)
然后用 creat()
来创建文件:
|
|
在程序运行之后检查发现 foo 的权限为 rw-rw-rw,显然因为 umask 为 0,创建文件完全按照 RWRWRW 所规定的权限,显然因为 umask 为 0,创建文件完全按照 RWRWRW 所规定的权限。
接下来我们在 umask() 中填写掩码,可以用在 stat.h 中存储的权限常量通过 |
累加操作:
|
|
这里的 umask 对应为 066,程序运行完后 bar 权限为 rw——- (600) 符合预期。
默认情况下,进程的 umask 继承自 shell。也就是说,子进程会从父进程中继承其的 umask。