AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 945782
Accepted
Ravexina
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

我知道:

  1. 文件默认 mod 是666
  2. umask值将从默认模组中删除。

那么为什么当我将“umask”设置为555它时没有将新创建的文件的权限设置为111?相反,它将它们设置为222

command-line
  • 3 3 个回答
  • 2225 Views

3 个回答

  • Voted
  1. 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.

    • 3
  2. 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(即只使用掩码的文件权限位),并返回掩码的先前值。

    • 2
  3. 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)。

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve