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