什么是umask'相对于'?

时间:2015-09-28 07:57:51

标签: linux ubuntu umask

我知道umask是一个最后阶段的过滤器'确保在新创建的文件或目录上设置特定权限位。我的问题是,它的作用是什么?如何确定输入权限集?

为了说明我的困惑,请考虑一下:

  • 我将umask设置为000
  • 我在我的主目录中创建了一个目录,并且perimssions是777
  • 我在sudo的帮助下在系统根目录(/)中创建了一个目录,权限是755

为什么会有差异?

1 个答案:

答案 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的目录。