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
    • 最新
    • 标签
主页 / unix / 问题 / 430616
Accepted
ikeDiM
ikeDiM
Asked: 2018-03-17 04:39:46 +0800 CST2018-03-17 04:39:46 +0800 CST 2018-03-17 04:39:46 +0800 CST

为什么有些 umask 值不生效?

  • 772

我试图更好地理解权限,所以我正在做一些“练习”。这是我在各自输出中使用的一系列命令:

$ 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 = 110 110 110 &
            !000 101 011
             110 110 110 &  
             111 010 100
           = 110 010 100 = 624 = rw--wr--
 
777& !0022 = 111 111 111 &
            !000 010 010
             111 111 111 &  
             111 101 101
           = 111 101 101 = 755 = rwxr--xr-x

小费

快速了解生成的权限(至少对我有帮助)的一种简单方法是认为我们只能使用 3 个十进制值:

r = 100 = 4 
w = 010 = 2
x = 001 = 1

权限将是这 3 个值的组合。
" "用于表示未给予相对权限。

666 = 4+2+" "   4+2+" "   4+2+" "  = rw rw rw  

因此,如果我当前的 umask 是0053我知道我正在从组中删除读取和执行(4+1) 权限,并(2+1)从其他组中删除写入和执行权限,则会导致

 4+2     " "+2+" "     4+" "+" "   = 624 = rw--w-r--  

(组和其他已经没有执行权限)

permissions umask
  • 2 2 个回答
  • 4624 Views

2 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-03-17T04:45:10+08:002018-03-17T04:45:10+08:00

    umask是一个掩码,它不是一个减去的值。因此:

    • 模式666,掩码022:结果为666&~022,即666&755,即644;
    • 模式666,掩码021:结果是666 & ~021,即666 & 756,即646。

    想想所涉及的部分。模式中的 6 表示第 1 位和第 2 位被设置、读取和写入。掩码中的 2 掩码位 1,即写位。掩码中的 1 掩码位 0,即执行位。

    另一种表示这一点的方法是查看文本形式的权限。666 是rw-rw-rw-;022 是----w--w-; 021 是----w---x。掩码从模式中删除其设置位,因此rw-rw-rw-被变为掩蔽,由----w--w-变为rw-r--r--掩蔽。----w---xrw-r--rw-

    • 27
  2. cas
    2018-03-17T05:03:58+08:002018-03-17T05:03:58+08:00

    你需要用二进制而不是十进制来思考。具体来说,有三个 3 位二进制数:所有者、组和其他各一个。每个值的范围从 000 到 111(十进制的 0-7)。

    例如 rw-rw-rw (666) 是 110 110 110。

    该umask值是一个掩码,指定在创建新文件或目录时哪些位将打开或关闭(1 或 0)。例如 022 十进制是 000 010 010 二进制,而 021 十进制是 000 010 001

    许可位与取反的 umask 一起进行 AND 运算以得出最终值。“否定”意味着所有位都被反转,即所有 1 都翻转为 0,反之亦然。例如NOT 022 (000 010 010) = 755 (111 101 101)

    示例:666 & !022 = 644。在二进制中,即:

      Owner  Group  Other     mode
       110    110    110      666 
    &  111    101    101      755   (this is the negated 022)
       ---    ---    ---      ---
       110    100    100      644
    

    另外,777 & !022 = 755:

      Owner  Group  Other     mode
       111    111    111      777 
    &  111    101    101      755
       ---    ---    ---      ---
       111    101    101      755
    

    请注意,如果在原始权限值(666 或 777)和取反的 umask中每个位的最终值都为 1,则每个位的最终值只能为 1 。如果其中任何一个为 0,则结​​果为 0。即1 & 1 = 1,而1 & 0 = 0。


    严格来说,setuid、setgid 和sticky 位有第四个3 位二进制数。这就是为什么您经常看到使用前导 0(或 0-7 中的其他一些前导数字)指定的权限和掩码。例如 0777 或 2755。

    • 11

相关问题

  • 组权限如何工作?

  • Redis日志文件权限错误,但是权限已经是777

  • 以 root 权限启动 zypper 命令

  • 以非特权用户身份运行时,meld 无法访问 /dev/fd/* 的可能原因是什么?

  • 另一个用户的非空子目录是否可以安全地从我的目录中删除?

Sidebar

Stats

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

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve