Ravexina Asked: 2017-08-13 21:47:00 +0800 CST2017-08-13 21:47:00 +0800 CST 2017-08-13 21:47:00 +0800 CST 为什么 umask 555 将文件 mods 设置为“222”而不是“111”? 772 我知道: 文件默认 mod 是666 umask值将从默认模组中删除。 那么为什么当我将“umask”设置为555它时没有将新创建的文件的权限设置为111?相反,它将它们设置为222 command-line 3 个回答 Voted Best Answer Ravexina 2017-08-13T21:47:00+08:002017-08-13T21:47:00+08:00 简短的回答: 因为使用 a5你正在删除read (4)andexecutable (1)位,所以你最终只得到write (2). 解释: 555您没有设置默认可执行位。 It's wrong => (6 - 5 = 1) 我们得到了这些模组: 4 = 读取 2 = 写 1 = 可执行 我可以创建 a 的唯一方法5是 from 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. Yaron 2017-08-13T21:55:32+08:002017-08-13T21:55:32+08:00 结果 umask 值为mask & 0777(按位和) 当掩码为 0555 时, 比0555 & 0777结果为0222 nixCraft 理解-linux-unix-umask-value-usage 任务:计算文件的最终权限 您可以简单地从基本权限中减去 umask 以确定文件的最终权限,如下所示: 666 – 022 = 644 File base permissions : 666 umask value : 022 subtract to get permissions of new file (666-022) : 644 (rw-r–r–) 任务:计算 DIRECTORIES 的最终权限 您可以简单地从基本权限中减去 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 Q&A 中所述 如何将权限位硬编码到标准实用程序中。以下是包中两个文件的一些相关行,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 程序中创建文件时,您可以直接在其中进行系统调用,或者从允许您进行低级系统调用的语言中创建文件(例如,参见 Perlsysopen在 perldoc -f sysopen)。 男人 umask umask() 将调用进程的文件模式创建掩码(umask)设置为 掩码&0777(即只使用掩码的文件权限位),并返回掩码的先前值。 vitaminace33 2020-10-11T14:04:19+08:002020-10-11T14:04:19+08:00 定义 粗略地说,一般来说,掩码的开启位会关闭(如果尚未关闭)它正在掩码的位。 更准确地说,在这种特殊情况下,新创建的文件或文件夹的结果模式遵循以下按位运算: 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)。
简短的回答:
因为使用 a
5
你正在删除read (4)
andexecutable (1)
位,所以你最终只得到write (2)
.解释:
555
您没有设置默认可执行位。我们得到了这些模组:
我可以创建 a 的唯一方法
5
是 from4 + 1
,因此5
实际上意味着:这意味着“删除”可执行文件并读取正在设置的模块。
换句话说,随着
umask 555
您从默认文件模式 (6) 中删除读取 (4) 和可执行 (1) 位,这会将我们带到 (2),因为在 6 中我们只有 4 和 2 需要删除(不是任何1):您的删除只会影响 4,因此文件以
222
.在二进制
以二进制形式考虑它:
文件默认模式为666(110 110 110),我们的
umask
值为555
(101 101 101):看?我们最终得到了 -www- 或
222
.结果 umask 值为mask & 0777(按位和)
当掩码为 0555 时,
比0555 & 0777结果为0222
touch file
和之间的差异的来源mkdir dir
:定义
粗略地说,一般来说,掩码的开启位会关闭(如果尚未关闭)它正在掩码的位。
更准确地说,在这种特殊情况下,新创建的文件或文件夹的结果模式遵循以下按位运算:
其中
result
是结果模式,mode
是通常模式(文件为 666,文件夹为 777),并且是设置掩码!mask
的按位否定。mask
例子
屏蔽左侧的写入 (2) 权限,以及右侧的读取 (4) 和执行 (1) 权限。
笔记
从最后一个示例中可以看出,掩码与减法不一致(十进制和二进制表示法中的 6-5=1)。