我知道:
- 文件默认模式是
666
umask
值将从默认模块中删除。
那么为什么当我将“umask”设置为时,555
它不会将新创建文件的权限设置为111
?而是将其设置为222
答案1
简短回答:
因为使用5
您要删除read (4)
和executable (1)
位,所以最终只剩下write (2)
。
解释:
您555
没有设置默认可执行位。
It's wrong => (6 - 5 = 1)
我们得到了以下修改:
- 4 = 读取
- 2 = 写入
- 1 = 可执行
我可以创建的唯一方法5
是从4 + 1
,所以5
实际上意味着:
4 (Read) + 1 (Executable) = 5
它的意思是“删除”可执行文件,并且读取正在设置的模式。
换句话说,umask 555
您正在从默认文件模式( 6 )中删除读取( 4 )和可执行( 1 )位,这将我们带到( 2 ),因为在 6 中我们只需要删除 4 和 2(而不是任何 1):
6 = 4 + 2
您的删除仅影响 4,因此文件最终为222
。
二进制
以二进制来思考:
1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111
文件默认模式为 666(110 110 110),我们的umask
值为555
(101 101 101):
Decimal title -> 421 421 421
666 in binary -> 110 110 110
- 555 in binary -> - 101 101 101
_____________
010 010 010
2 2 2
-w- -w- -w-
看到了吗?我们最终得到了 -www-,或者222
。
答案2
结果 umask 值为面膜 & 0777(位和)
当掩码为 0555
时0555 和 0777结果0222
nixCraft 理解-linux-unix-umask 值用法
任务:计算文件的最终权限
您可以简单地从基本权限中减去 umask 来确定文件的最终权限,如下所示:
666 – 022 = 644 File base permissions : 666 umask value : 022 subtract to get permissions of new file (666-022) : 644 (rw-r–r–)
任务:计算目录的最终权限
您可以简单地从基本权限中减去 umask 来确定目录的最终权限,如下所示:
777 – 022 = 755 Directory base permissions : 777 umask value : 022 Subtract to get permissions of new directory (777-022) : 755 (rwxr-xr-x)
touch file
和之间差异的来源mkdir dir
:
注:如本申请中所规定Unix 问答
权限位是如何硬编码到标准实用程序中的。以下是包含和
coreutils
源代码的软件包中的两个文件的一些相关行:touch(1)
mkdir(1)
mkdir.c
:if (specified_mode) { struct mode_change *change = mode_compile (specified_mode); if (!change) error (EXIT_FAILURE, 0, _("invalid mode %s"), quote (specified_mode)); options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change, &options.mode_bits); free (change); } else options.mode = S_IRWXUGO & ~umask_value; }
换句话说,如果没有指定模式,则将其设置为
S_IRWXUGO
(读作:0777) 由 修改umask_value
。
touch.c
更加清楚的是:int default_permissions = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
也就是说,赋予每个人读写权限(读取:0666),
umask
当然,这将由文件创建时的进程修改。您可能只能通过编程来解决这个问题:即在 C 程序中创建文件时直接进行系统调用,或者在允许您进行低级系统调用的语言中创建文件(例如,参见 下的 Perl
sysopen
)perldoc -f sysopen
。umask() 将调用进程的文件模式创建掩码 (umask) 设置为 面膜 & 0777(即,只使用掩码的文件权限位),并返回掩码的先前值。
答案3
定义
粗略地说,一般来说,掩码的开启位会关闭(如果尚未关闭)被掩码的位。
更准确地说,在这种特殊情况下,新创建的文件或文件夹的最终模式遵循以下按位运算:
result = mode & !mask
其中result
是结果模式,mode
是通常模式(文件为 666,文件夹为 777),是集合掩码!mask
的按位取反。mask
例子
屏蔽左侧的写入(2)权限以及右侧的读取(4)和执行(1)权限。
folder file folder file
(7) 111 mask 110 (6) (7) 111 mask 110 (6)
101 <-- !010 --> 101 010 <-- !101 --> 010
&----- (2) &----- &----- (5) &-----
(5) 101 100 (4) (2) 010 010 (2)
笔记
从最后一个例子可以看出掩蔽与减法不一致(十进制和二进制中 6-5=1)。