【问题标题】:What is the umask 'relative to'?umask“相对于”是什么?
【发布时间】:2015-09-28 07:57:51
【问题描述】:

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

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

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

为什么不一样?

【问题讨论】:

  • 它从完整的权限集过滤,所以从0777
  • 您不应该拥有在 / 下创建目录的权限,您是否以其他用户身份执行了该步骤,例如使用须藤?还是在不同的外壳中?
  • 你用什么来创建目录? mkdir 命令?在你提到的两种情况下,你都是root吗?
  • 我使用 sudo 在根目录下创建目录。我更新了 OP 以反映这一点。
  • 您是在 sudo 之前、在 sudo 之后但在 mkdir 之前运行 umask 命令,还是两者都运行?

标签: linux ubuntu umask


【解决方案1】:

umask 由创建文件系统对象的某些系统调用解释。它通常与传递给系统调用的显式模式参数有关。例如,mkdir 的工作方式如下:

int mkdir(const char *path, mode_t mode);

新目录的文件权限位应从mode初始化。 mode 参数的这些文件权限位应由进程的文件创建掩码修改。

open 这样做:

int open(const char *path, int oflag, ... );

文件模式的访问权限位(见)应设置为mode_t类型的第三个​​参数的值修改如下:按位对文件模式位和进程的文件模式创建掩码的补码中的相应位执行 AND。这样,文件模式创建掩码中相应位被设置的文件模式中的所有位都被清除。

一个进程的umask由它的子进程继承,当然任何进程都可以改变它自己的umask。

根据 OP 提供的信息,我将假设 OP 从 shell 运行以下命令:

umask 000
mkdir ~/foo
sudo mkdir /foo

mkdir 命令使用如下默认模式:

S_IRWXU、S_IRWXG 和 S_IRWXO 的按位或的值用作模式参数。

所以S_IRWXU|S_IRWXG|S_IRWXO 是 0777,正如预期的那样,当 umask 为 000 时,~/foo 的模式将为 0777。

但是sudo 总是设置一个 umask,要么设置为 /etc/sudoers 中列出的值,要么设置为编译时选择的默认值,在 Ubuntu 上为 022。所以sudo mkdir /root/foo 将使用 022 的 umask 运行,从而生成一个目录那是0755。

【讨论】:

  • 谢谢马克,我想的更多了
猜你喜欢
  • 2012-01-02
  • 2012-08-20
  • 2016-12-12
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 2019-02-01
  • 1970-01-01
相关资源
最近更新 更多