umask 在 Linux 中是如何计算的?

Bra*_*iam 18 umask

所以我知道umask可以限制特权用户,使用这种格式umask ugo

我知道 read = 4, write = 2, and exec = 1. 但是,当我输入时umask,它返回 4 位数字,即0022or 0073。我现在不知道这是如何工作的,因为有一个额外的数字。那个额外的数字是什么0022意思?

Bra*_*iam 21

假设默认掩码为 0666。0022 umask将使新掩码 0644 (0666-0022=0644) 表示该组和其他人具有读取(无写入或执行)权限。

“额外”数字(第一个数字 = 0)指定没有特殊模式。

如果 mode 以数字开头,它将被解释为八进制,否则它意味着是符号。

0 是一个数字,就像 1(对于粘滞位)或 6(对于 SGID)一样。chmod可以通过其他方法调用诸如此类的命令,例如chmod ug+rw mydir您将在哪里为用户和组添加读写权限。请注意,这种情况下的模式 (ug+rw) 不以数字开头,因此不会被解释为八进制而是符号。

参见en.wikipedia.org/wiki/Chmod#Symbolic_examples了解符号以及www.lifeaftercoffee.com/2007/03/20/special-permission-modes-in-linux-and-unix/了解一些特殊模式。

我不知道你会用 揭开第一位umask,但从技术上讲你可以。这将解释为什么您几乎总是将其视为零。

感谢pinkfloydx33

掩码的第一个数字处理不完全适合所有者/组/其他模型的特殊权限。当为文件权限提供四位数字时,第一位是指那些特殊值:

4000 = SUID
2000 = SGID
1000 = sticky bit
Run Code Online (Sandbox Code Playgroud)

SUID 位是 set-user-ID 的缩写,它使可执行程序以所有者的有效用户 ID (uid) 运行——换句话说,无论谁执行它,程序都以所有者的权限执行。这在执行需要 root 权限但旨在由普通用户运行的程序中很常见:passwd就是一个这样的例子。

SGID 位是 set-group-ID 的缩写,非常相似,但使用所有者的有效ID (gid)运行。

粘性位有点复杂,如果您想了解更多信息,可以阅读sticky.

这些位也可以与目录一起使用,但它们的含义会发生变化。

我不相信您实际上可以将 设置为umask默认情况下允许您启用这些额外位中的任何一个,但无论如何您可能永远不想这样做。

感谢user470379

  • 实际上,除了最后 3 位数字之外,您不能提供非零值。根据 Posix 的说法:“未指定指定文件模式位而不是文件权限位的模式值的解释。” 根据“man 2 umask”(相应的系统调用)“仅使用“mask”的文件权限位”。在 `bash` 中,umask 1000 生成错误:“八进制数超出范围”。那么为什么要多加0呢?我认为这只是为了表明该数字是八进制的。 (3认同)
  • @Braiam:你计算新掩码的公式是错误的,它不是“0666-0022”,而是“0666 & ~0022”。 (3认同)
  • 我认为反对的不是数字的写法,而是使用减法运算符 (-) 而不是按位和 (&)。 (2认同)