我试图更好地理解权限,所以我正在做一些“练习”。这是我正在使用的命令序列及其各自的输出:
$ 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
这是有道理的,因为我们知道默认文件权限为666
(rw-rw-rw-
),目录默认权限为777
(rwxrwxrwx
)。如果我从这些默认权限,我减去umask值
666-022=644
,rw-r--r--
为的file1
,所以它的连贯与以前的输出;
777-022=755
,rwx-r-x-r-x
对于dir1
,也很连贯。
但是,如果我将umask从更改022
为021
,则不再可用。
这是文件的示例:
$ 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-
是756
,777-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--
(组和其他人尚未具有执行权限)