为什么某些umask值不生效?


9

我试图更好地理解权限,所以我正在做一些“练习”。这是我正在使用的命令序列及其各自的输出:

$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1

这是有道理的,因为我们知道默认文件权限为666rw-rw-rw-),目录默认权限为777rwxrwxrwx)。如果我从这些默认权限,我减去umask值 666-022=644rw-r--r--为的file1,所以它的连贯与以前的输出; 777-022=755rwx-r-x-r-x对于dir1,也很连贯。

但是,如果我将umask从更改022021,则不再可用。

这是文件的示例:

$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2

-rw-r--rw-646但应该是666-021=645。因此,根据先前的计算,它不起作用。

这是目录的示例:

$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2

drwxr-xrw-756777-021=756。因此,在这种情况下,结果与先前的计算是一致的。

我已经读过这个人,但没有发现任何有关此行为的信息。

有人可以解释为什么吗?

说明

正如答案中指出的那样:从数学上来说,默认目录和文件的权限umask不会减去的值。

有效涉及的运算是AND(&)和NOT(!)布尔运算符的组合。鉴于:

R =最终权限
D =默认权限
U =当前umask

R = D&!U

例如:

666&!0053 = 110110110& 
            !000101011 
             110110110&  
             111010100
           = 110010100 = 624 = rw--wr--
 
777&!0022 = 111111111& 
            !000010010
             111111111&  
             111101101
           = 111101101 = 755 = rwxr--xr-x 

小费

快速了解所产生的权限的一种简单方法(至少对我有所帮助)是认为我们只能使用3个十进制值:

r = 100 = 4 
w = 010 = 2
x = 001 = 1

权限将是这三个值的组合。
" "用于表示未给予相对许可。

666 = 4+2+" "   4+2+" "   4+2+" "  = rw rw rw  

因此,如果我当前的umask是0053我知道(4+1) 要从组中删除读取和执行权限,并(2+1)从其他对象中删除写入和执行权限,

 4+2     " "+2+" "     4+" "+" "   = 624 = rw--w-r--  

(组和其他人尚未具有执行权限)

Answers:


26

umask是一个遮罩,不是一个减去的值。从而:

  • 模式666,掩码022:结果为666&〜022, 666&755,即644;
  • 模式666,掩码021:结果为666&〜021, 666&756,即646。

想想所涉及的位。模式下的6表示位1和2被设置,读取和写入。掩码中的2屏蔽位1,即写位。掩码中的1屏蔽位0(执行位)。

表示此问题的另一种方法是查看文本形式的权限。666是rw-rw-rw-; 022是----w--w-; 021是----w---x。掩模从模式降至其组比特,所以rw-rw-rw-掩蔽用----w--w-rw-r--r--,掩蔽由----w---xrw-r--rw-


11

您需要考虑二进制而不是十进制。具体来说,有3个3位二进制数:所有者,组和其他各一个。每个值的范围从000到111(十进制为0-7)。

例如rw-rw-rw(666)是110110110。

umask值是一个掩码,用于指定在创建新文件或目录时哪些位将打开或关闭(1或0)。例如022十进制是000 010 010二进制,而021十进制是000 010 001

允许位与否定的umask进行“与”运算以得出最终值。“取反”表示所有位都被反转,即所有1都翻转为0,反之亦然。例如NOT 022 (000 010 010) = 755 (111 101 101)

范例:666 & !022 = 644。用二进制表示:

  Owner  Group  Other     mode
   110    110    110      666 
&  111    101    101      755   (this is the negated 022)
   ---    ---    ---      ---
   110    100    100      644

另外,777 & !022 = 755

  Owner  Group  Other     mode
   111    111    111      777 
&  111    101    101      755
   ---    ---    ---      ---
   111    101    101      755

请注意,each位的终值只能是1,如果它是在1 原许可值(666或777)在否定的umask。如果其中任何一个为0,则结果为0。即1&1 = 1,而1&0 = 0


严格来说,setuid,setgid和sticky位有第四个3位二进制数。这就是为什么您经常看到以0开头(或0-7的其他一些开头数字)指定的权限和掩码的原因。例如0777或2755。


2
从技术上讲,它是八进制的,而不是十进制的,但这并没有真正改变答案的核心。
David Z

@DavidZ:OP认为它是十进制的(请参阅Q中的减法示例),这大概是cas所指的。
Lightness Races in Orbit

1
@Lightness由OP给出的减法示例可以是八进制或十进制,因为没有数字达到8并且永远不需要进位。我同意OP可能会以小数形式思考,但是问题中没有任何证据可以证明这一点。
史蒂芬·基特

@StephenKitt:像我的手指外貌必须在键盘上滑动,当我在写的例子成的calc.exe来证明它😂
在轨道亮度竞赛

1
@cas是的,我也不同意这部分(这也是我回答的基础),只是Lightness断言OP是用十进制而不是八进制计算的。
史蒂芬·基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.