我知道 umask 是一个“最后阶段过滤器”,可确保在新创建的文件或目录上设置特定的权限位。我的问题是,它的作用是什么?输入权限集如何确定?
为了说明我的困惑,请考虑一下:
- 我将 umask 设置为 000
- 我在我的主目录中创建了一个目录,权限是 777
- 我在sudo的帮助下在系统根目录(/)创建了一个目录,权限是755
为什么有区别?
umask 由创建文件系统对象的某些系统调用解释。它通常与传递给系统调用的显式模式参数有关。例如,mkdir的工作方式如下:
int mkdir(const char *path, mode_t mode);
新目录的文件权限位应从 初始化
mode
。mode 参数的这些文件权限位应由进程的文件创建掩码修改。
并且open这样做:
int open(const char *path, int oflag, ... );
文件模式的访问权限位(参见<sys/stat.h>)应设置为作为类型修改的第三个参数
mode_t
的值,修改如下:对文件模式位和相应位执行按位与在进程的文件模式创建掩码的补充。因此,在文件模式创建掩码中设置了相应位的文件模式中的所有位都被清除。
进程的 umask 由其子进程继承,当然任何进程都可以更改自己的 umask。
根据 OP 提供的信息,我将假设 OP 从 shell 运行以下命令:
umask 000
mkdir ~/foo
sudo mkdir /foo
mkdir命令使用如下默认模式:
S_IRWXU、S_IRWXG 和 S_IRWXO 的按位或的值用作模式参数。
0777 也是如此S_IRWXU|S_IRWXG|S_IRWXO
,正如预期的那样,使用 000 的 umask,模式~/foo
将为 0777。
但是sudo总是设置一个 umask,要么是列出的值,要么是/etc/sudoers
在编译时选择的默认值,在 Ubuntu 上是 022。因此sudo mkdir /root/foo
将使用 022 的 umask 运行,从而产生一个 0755 的目录。