为什么 umask 555 将文件模式设置为“222”而不是“111”?

为什么 umask 555 将文件模式设置为“222”而不是“111”?

我知道:

  1. 文件默认模式是666
  2. 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 sysopenperldoc -f sysopen

人umask

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)。

相关内容