zoukankan      html  css  js  c++  java
  • Linux—用户新建目录和文件的默认权限设置:umask详解

    技术公众号:后端技术解忧铺
    关注微信公众号:CodingTechWork,一起学习进步。

    引言

      我们有没有思考过一个问题,在登录Linux系统后,我们创建的目录或者文件的权限,为什么每次创建都是统一的?我们做以下实验:新建一个用户userA,然后分别创建目录dir01和dir02,文件t1.txt和t2.txt。

    [root@linux01 ~]# useradd userA
    [root@linux01 ~]# su - userA
    [userA@linux01 ~]$ ll
    total 0
    [userA@linux01 ~]$ mkdir dir01
    [userA@linux01 ~]$ mkdir dir02
    [userA@linux01 ~]$ touch t1.txt
    [userA@linux01 ~]$ touch t2.txt
    [userA@linux01 ~]$ ll
    total 8
    drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
    drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
    -rw-r----- 1 userA userA    0 Mar 27 10:25 t1.txt
    -rw-r----- 1 userA userA    0 Mar 27 10:25 t2.txt
    
    

      从上述的实验中发现,每次创建目录的权限都是drwxr-x---,即为750,文件的权限都是-rw-r-----即为640。我们能想到的必定这是个默认权限,那这个默认权限由谁来控制?答案是:umask

    [userA@linux01 ~]$ umask
    0027
    

      是的,我们可以通过umask来改变用户的创建文件和目录的默认权限,Linux是注重安全性的OS,而安全离不开权限的设置,对于创建新的目录和文件设定必要的初始权限是必不可少的,Linux和Windows在权限一个很大的区别就是:Windows中,新建目录和文件是继承上级目录权限;Linux是通过使用umask设置的默认权限给新建的目录和文件赋予初始权限。下面将一起走进umask的学习和使用。

    umask

    umask介绍

      首先,我们要了解的是,Linux文件的最大权限是666,目录的最大权限是777,为何目录要比文件权限大?因为目录需要有执行权(x)才能够进入到目录中。
      umask的作用是在用户登录Linux系统环境下,设置用户创建目录和文件的初始化权限。

    umask命令

    语法:

    • umask [-p] [-S] [mode]
      参数:
    • -p:表示完整打印umask内容。
    • -S:表示以符号形式显示设置。
    • mode:表示设置权限,mode和chmod的命令格式一样。
      示例:
    [userA@linux01 ~]$ umask -p
    umask 0027
    [userA@linux01 ~]$ umask -S
    u=rwx,g=rx,o=
    [userA@linux01 ~]$ umask u=rw
    [userA@linux01 ~]$ umask -p -S
    umask -S u=rw,g=rx,o=
    [userA@linux01 ~]$ umask -p
    umask 0127
    [userA@linux01 ~]$ umask u=rwx
    [userA@linux01 ~]$ umask -p
    umask 0027
    [userA@linux01 ~]$ umask o=x
    [userA@linux01 ~]$ umask -p
    umask 0026
    [userA@linux01 ~]$ umask -p -S
    umask -S u=rwx,g=rx,o=x
    

    umask存放位置

      一般umask的值可以在/etc/profile文件中定义。

    # By default, we want umask to get set. This sets it for login shell
    # Current threshold for system reserved uid/gids is 200
    # You could check uidgid reservation validity in
    # /usr/share/doc/setup-*/uidgid file
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
        umask 002
    else
        umask 022
    fi
    ··· ···
    ··· ···
    umask 027
    

      其中,我们可以看到账号UID>199UID=GID用户名=用户组名时,umask值为002,否则,umask值为022
      umask 027表示当前用户的umask掩码值设置为027。

    umask值计算

      上面一直在讲umask掩码值,那这个值究竟怎么计算?或者说,这个掩码值和目录或文件的默认权限关系是怎样的?

    [userA@linux01 ~]$ umask
    0027
    

      我们通过umask命令获取到当前用户的umask掩码值为0027,为何是4位?其实真正有效的是后3位。第1位是代表文件所具有的特殊权限(SetUID、SetGID、Sticky BIT)。
      通过umask值我们可以反推出用户新建目录和文件的默认权限是什么。

    原理

    1. 将目录或文件的默认最高权限(目录777、文件666)和umask掩码值都转换为二进制。
    2. 对umask取反
    3. 将两个二进制值做与运算
    4. 将与运算后的二进制值转换为十进制,即为用户的新建目录或文件的默认权限。

    示例

    目录场景

    • 掩码值:0022
    • 目录默认最高权限:777

    计算默认权限:

    1. 转为二进制:
      777 = 0111 0111 0111
      022 = 0000 0010 0010
    2. umask取反
      NOT运算:1111 1101 1101
    3. 与运算
      0111 0111 0111 总权限777
      1111 1101 1101 umask取反
      ====================
      0111 0101 0101 新建目录默认权限
    4. 转为十进制
      0111 0101 0101=755
      即该用户新建目录的默认权限为755,即为rwxr-xr-x

    文件场景

    • 掩码值:0022
    • 目录默认最高权限:666

    计算默认权限:

    1. 转为二进制:
      666 = 0110 0110 0110
      022 = 0000 0010 0010
    2. umask取反
      NOT运算:1111 1101 1101
    3. 与运算
      0110 0110 0110 总权限666
      1111 1101 1101 umask取反
      ====================
      0110 0100 0100 新建目录默认权限
    4. 转为十进制
      0110 0100 0100 = 644
      即该用户新建目录的默认权限为644,即为rw-r--r--

    公式

      按照umask计算的原理很麻烦,所以弄一个公式来总结计算如下:

    • 目录(文件)的初始权限 = 目录(文件)的最大默认权限 - umask权限

      而这种公式方式需要注意分类:

    • 目录公式:
      用户目录默认权限 = 777 - umask值

    • 文件公式:
      1)偶数umask:用户文件默认权限 = 666 - umask偶数值
      2)奇数umask:用户文件默认权限 = 666 - umask奇数值 + 1

    示例

    1. 对照原理示例umask值=022,计算如下:
      用户目录默认权限:777-022=755,即为rwxr-xr-x
      用户文件默认权限:666-022=644,即为rw-r--r--

    2. 对照引言中的实验umask值=027,计算如下:
      用户目录默认权限:777-027=750,即为drwxr-x---
      用户文件默认权限:666-027+1=640,即为-rw-r-----

    umask值修改

    暂时修改

      暂时修改的方式,可以通过umask命令来更改,比如计算出权限对应的umask值要改为027,则直接用该用户登录Linux系统后,使用命令umask 027即可。但是,一旦用户退出登录后,umask将恢复默认值,刚才设置的将会失效。所以,这种umask命令方式,只是适合当前会话。

    永久修改

      除了使用umask命令进行当前会话的用户默认权限设置外,我们还可以对该用户永久性修改umask值。针对某个用户修改,需要用该用户登录Linux,然后修改/etc/profile文件中的umask值。
      修改前:

    [userA@linux01 ~]$ umask
    0027
    [userA@linux01 ~]$ vim /etc/profile
    

    /etc/profile

      修改后:

    [userA@linux01 ~]$ vim /etc/profile
    [userA@linux01 ~]$ umask
    0022
    [userA@linux01 ~]$ mkdir dir03
    [userA@linux01 ~]$ touch t3.txt
    [userA@linux01 ~]$ ll
    total 12
    drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
    drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
    drwxr-xr-x 2 userA userA 4096 Mar 27 21:48 dir03
    -rw-r----- 1 userA userA    0 Mar 27 10:25 t1.txt
    -rw-r----- 1 userA userA    0 Mar 27 10:25 t2.txt
    -rw-r--r-- 1 userA userA    0 Mar 27 21:48 t3.txt
    

      明显可以看出修改后,新建目录和文件的权限已经发生变化。

    总结

      如果我们登陆Linux系统后,新建目录或者文件很多,且权限都是某种特定的,则可以通过umask命令来暂时设置当前会话的默认权限。如果后期需要永久性的可以修改/etc/profile中的umask值。
      当然,对于应用程序一些吐文件时需要先新建的目录或者文件设置权限时,我们为了安全方式,可能不能永久性修改umask值,但,我们可以在启动脚本里面加上umask 022这种命令,来使得当前应用启动时受到当前启动脚本中的umask来控制应用程序输出的文件或目录的默认权限。

    烧不死的鸟就是凤凰
  • 相关阅读:
    可视化工具之 IGV 使用方法
    SAM格式 及 比对工具之 samtools 使用方法
    比对工具之 BWA 使用方法
    项目一:使用二代测序数据进行基因组组装(局部组装)
    Linux 打包和压缩 方法详解
    Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】
    ORACLE表空间查询和管理【转】
    MySQL分布式集群之MyCAT(三)rule的分析【转】
    MySQL分布式集群之MyCAT(二)【转】
    linux快速复制大量小文件方法 nc+tar【转】
  • 原文地址:https://www.cnblogs.com/Andya/p/14587825.html
Copyright © 2011-2022 走看看