• Linux学习-31-Linux权限位及修改文件和目录的权限


    9.4 Linux权限如何设定(权限位)
    • Linux 系统,最常见的文件权限有 3 种,即对文件的读(用 r 表示)、写(用 w 表示)和执行(用 x 表示,针对可执行文件或目录)权限。在 Linux 系统中,每个文件都明确规定了不同身份用户的访问权限,通过 ls 命令即可看到。

    在Linux中我们可以使用ll -l或者lls-l命令来显示一个文件的属性以及文件所属的用户和组

    除此之外,"d"在Linux中代表该文件是一个目录文件,我们有时会看到 s(针对可执行文件或目录,使文件在执行阶段,临时拥有文件所有者的权限)和 t(针对目录,任何用户都可以在此目录中创建文件,但只能删除自己的文件),文件设置 s 和 t 权限,会占用 x 权限的位置。

    • 在Liux中第一个字符代表这个文件是目录、文件或链接文件等等:

      • 当为[d]则是目录
      • 当为[-]则是文件;
      • 若是[I]侧表示为链接文档(link file);
      • 若是[b]则表示为装置文件里面的可供储存的接口设备(可随机存取装置)
      • 若是[c]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
      • 接下来的字符中,以三个为一组,且均为rwx的三个参数的组合。
      • 其中,[r]代表可读(read)、[w]代表可写(write)、[x]代表可执行(execute)。
      • 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[-]而已。
    • 以 root 的身份登陆 Linux,并执行如下指令:

    [root@CncLucZK test]# ll -l
    total 5280
    -rw-r--r-- 1 root root      38 Oct 12 23:10 add.sh		#root用户都没有执行权限x,其他用户也没有
    -rw-r--r-- 1 root root      41 Oct 12 23:10 awk.sh
    -rw-r--r-- 1 root root 5324748 Oct 12 23:10 blog.docx
    drwxr-xr-x 3 root root    4096 Oct  9 21:11 config
    -rwxr-xr-x 1 zk   zk        90 Oct 13 18:56 demo2.txt
    -rw-r--r-- 1 root root      90 Oct 13 20:06 demonew.txt
    -rw-r--r-- 1 root root      90 Oct 14 00:53 demoold.txt
    -rw-r--r-- 1 root root    2612 Oct 12 23:10 demotmo.txt
    -rw-r--r-- 1 zk   root    2612 Oct 15 23:01 demo.txt
    -rw-r--r-- 1 root root      79 Oct 12 23:10 demo.txt.bz2
    -rw-r--r-- 1 root root     312 Oct 13 20:07 differ.patch
    -rw-r--r-- 1 root root       0 Oct 13 19:03 differ.txt
    -rw-r--r-- 3 root root      95 Oct 12 23:10 hardlink.txt
    -rw-r--r-- 3 root root      95 Oct 12 23:10 index.html
    -rw-r--r-- 1 root root      37 Oct 12 23:10 replace.txt
    -rw-r--r-- 1 root root       9 Oct 12 23:10 softlink
    -rw-r--r-- 1 root root     381 Oct 12 23:10 test1.sh
    -rwxr-xr-x 1 root root     117 Oct 12 23:10 test.sh
    lrwxrwxrwx 1 root root       7 Oct 12 23:10 tmp_s.txt -> tmp.txt	#tmp_s.txt快捷方式指向tmp.txt具体文件或目录
    -rw-r--r-- 1 root root       6 Oct 12 23:10 tmp.txt
    drwx--x--x 4 root root    4096 Oct 12 23:10 user
    drwx--x--x 6 root root    4096 Oct 12 23:10 users
    -rw-r--r-- 1 root root     382 Oct 13 18:33 users.tar.gz
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 在以上实例中,user 文件是一个目录文件,属主和属组都为 root,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。
    • 可以看到,每行的第一列表示的就是各文件针对不同用户设定的权限,一共 10 位,但第 1 位用于表示文件的具体类型
      在这里插入图片描述

    从左至右用 0-9 这些数字来表示。

    0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。

    第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。

    其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;

    2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。

    可能其他版本或早些版本还有一位,最后一位此文件受 SELinux 的安全规则管理

    • 因此,为文件设定不同用户的读、写和执行权限,仅涉及到 9 位字符,以 ls 命令输出信息中的 demo.txt文件为例,设定不同用户的访问权限是 rw-r–r–,各权限位的含义如下图所示。
      在这里插入图片描述
      在这里插入图片描述
    • 从图中可以看到,Linux 文件的基本权限就有九个,Linux 将访问文件的用户分为 3 类,分别是文件的所有者,所属组(也就是文件所属的群组)以及其他人,三种身份各有自己的 read/write/execute 权限。。 有关群组的概念,我们已在用户和用户组一章中做了说明。除了所有者,以及所属群组中的用户可以访问文件外,其他用户(其他群组中的用户)也可以访问文件,这部分用户都归为其他人范畴。
    • 很显然,Linux 系统为 3 种不同的用户身份,分别规定了是否对文件有读、写和执行权限。拿上图来说,文件所有者拥有对文件的读和写权限,但是没有执行权限;所属群组中的用户只拥有读权限,也就是说,这部分用户只能读取文件内容,无法修改文件;其他人也是只能读取文件。
    • Linux 系统中,多数文件的文件所有者和所属群组都是 root(都是 root 账户创建的),这也就是为什么,root 用户是超级管理员,权限足够大的原因。
    9.5 chmod命令:修改文件或目录的权限
    • chmod 命令:可以手动修改文件的访问权限。chmod 命令设定文件权限的方式有 2 种,分别可以使用数字或者符号来进行权限的变更。
    9.5.1 chmod命令使用数字修改文件权限
    • Linux 系统中,文件的基本权限由 9 个字符组成,以 rwxrw-r-x 为例,这九个权限是三个三个一组的,我们可以使用数字来代表各个权限,各个权限与数字的对应关系如下:
    r --> 4
    w --> 2
    x --> 1
    
    • 1
    • 2
    • 3
    • 由于这 9 个字符分属 3 类用户,因此每种用户身份包含 3 个权限(r、w、x),通过将 3 个权限对应的数字累加,最终得到的值即可作为每种用户所具有的权限。拿 rwxrw-r-x 来说,所有者、所属组和其他人分别对应的权限值为:此权限对应的权限值就是 765。
    所有者 = rwx = 4+2+1 = 7
    所属组 = rw- = 4+2 = 6
    其他人 = r-x = 4+1 = 5
    
    • 1
    • 2
    • 3
    • 使用数字修改文件权限的 chmod 命令基本格式为:-R(注意是大写)选项表示连同子目录中的所有文件,也都修改设定的权限。
    [root@CncLucZK ~]# chmod [-R] 权限值 文件名 		#权限值就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
    
    • 1
    • 如使用如下命令,即可完成对 demo2.txt 目录文件的权限修改:
    [root@CncLucZK test]# ll -l demo.txt
    -rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
    [root@CncLucZK test]# chmod 776 demo.txt
    [root@CncLucZK test]# ll -l demo.txt
    -rwxrwxrw- 1 zk root 2612 Oct 15 23:01 demo.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通常我们以 Vim 编辑 Shell 文件批处理文件后,文件权限通常是 rw-rw-r–(644),那么,如果要将该文件变成可执行文件,并且不让其他人修改此文件,则只需将此文件的权限该为 rwxr-xr-x(755)即可。

    9.5.2 chmod命令使用字母修改文件权限(常用)
    • 既然文件的基本权限就是 3 种用户身份(所有者user、所属组group和其他人others)搭配 3 种权限(rwx),chmod 命令中用 u、g、o 分别代表 3 种身份,还用 a 表示全部的身份(all 的缩写)。另外,chmod 命令仍使用 r、w、x 分别表示读、写、执行权限。

    • 使用字母修改文件权限的 chmod 命令,其基本格式如下图所示。
      在这里插入图片描述

    • 如果我们要设定 demo.txt 文件的权限为 rwxr-xr-x,则可执行如下命令:

    [root@CncLucZK test]# chmod 644 demo.txt
    [root@CncLucZK test]# ll -l demo.txt
    -rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
    [root@CncLucZK test]# chmod u=rwx,go=rx demo.txt
    [root@CncLucZK test]# ll -l demo.txt
    -rwxr-xr-x 1 zk root 2612 Oct 15 23:01 demo.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 如果想要增加demo.txt 文件的每种用户都可做写操作的权限,可以使用如下命令:
    [root@CncLucZK test]# chmod 644 demo.txt
    [root@CncLucZK test]# ll -l demo.txt
    -rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
    [root@CncLucZK test]# chmod a+w demo.txt
    [root@CncLucZK test]# ll -l demo.txt
    -rw-rw-rw- 1 zk root 2612 Oct 15 23:01 demo.txt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 而如果是要将权限去掉而不改变其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
    [root@CncLucZK ~]# chmod u+x,g+x,o+x demo.txt
    [root@CncLucZK ~]# ll -d demo.txt
    -rwxr-xr-x 1 root root 59 Oct 10 23:09 demo.txt
    [root@CncLucZK ~]# chmod a-x demo.txt
    [root@CncLucZK ~]# ll -d demo.txt
    -rw-r--r-- 1 root root 59 Oct 10 23:09 demo.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    9.6 umask命令:令新建文件和目录拥有默认权限
    • Linux 是注重安全性的操作系统,而安全的基础在于对权限的设定,不仅所有已存在的文件和目录要设定必要的访问权限,创建新的文件和目录时,也要设定必要的初始权限。Windows 系统中,新建的文件和目录时通过继承上级目录的权限获得的初始权限,而 Linux 不同,它是通过使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的。

    • 如何得知 umask 默认权限的值呢?直接通过 umask 命令即可:

    [root@CncLucZK ~]# umask
    0022
    #root用户默认是0022,普通用户默认是 0002
    
    • 1
    • 2
    • 3

    umask 默认权限由 4 个八进制数组成,但第 1 个数代表的是文件所具有的特殊权限(SetUID、SetGID、Sticky BIT),后 3 位数字 “022” 才是本节真正要用到的 umask 权限值,将其转变为字母形式为 ----w–w-。

    注意,虽然 umask 默认权限是用来设定文件或目录的初始权限,但并不是直接将 umask 默认权限作为文件或目录的初始权限,还要对其进行 “再加工”。

    • 文件和目录的真正初始权限,可通过以下的计算得到:官方的标准算法,需要将 umask 默认权限使用二进制并经过逻辑与和逻辑非运算后,才能得到最终文件或目录的初始权限
    文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限
    
    • 1
    • 显然,如果想最终得到文件或目录的初始权限值,我们还需要了解文件和目录的最大默认权限值。在 Linux 系统中,文件和目录的最大默认权限是不一样的:

      • 对文件来讲,其可拥有的最大默认权限是 666,即 rw-rw-rw-。也就是说,使用文件的任何用户都没有执行(x)权限。原因很简单,执行权限是文件的最高权限,赋予时绝对要慎重,因此绝不能在新建文件的时候就默认赋予,只能通过用户手工赋予。
      • 对目录来讲,其可拥有的最大默认权限是 777,即 rwxrwxrwx。
    • 接下来,我们利用字母权限的方式计算文件或目录的初始权限。以 umask 值为 022 为例,分别计算新建文件和目录的初始权限:

      • 文件的最大默认权限是 666,换算成字母就是 “-rw-rw-rw-”,umask 的值是 022,换算成字母为 “-----w–w-”。把两个字母权限相减,得到 (-rw-rw-rw-) - (-----w–w-) = (-rw-r–r–),这就是新建文件的初始权限。
    [root@CncLucZK test]# ll demotmo.txt
    -rw-r--r-- 1 root root 2612 Oct 12 23:10 demotmo.txt
    
    • 1
    • 2
      • 目录的默认权限最大可以是 777,换算成字母就是 “drwxrwxrwx”,umask 的值是 022,也就是 “-----w–w-”。把两个字母权限相减,得到的就是新建目录的默认权限,即 (drwxrwxrwx) - (-----w–w-) = (drwxr-xr-x)
    [root@CncLucZK test]# ll -d users
    drwx--x--x 6 root root 4096 Oct 12 23:10 users
    
    • 1
    • 2

    注意,在计算文件或目录的初始权限时,不能直接使用最大默认权限和 umask 权限的数字形式做减法,这是不对的。例如,若 umask 默认权限的值为 033,按照数字形式计算文件的初始权限,666-033=633,但我们按照字母的形式计算会得到 (rw-rw-rw-) - (----wx-wx) = (rw-r–r–),换算成数字形式是 644。

    这里的减法,其实是“遮盖”的意思,也就是说,最大默认权限中和 umask 权限公共的部分,通过减法运算会被遮盖掉,最终剩下的“最大默认权限”,才是最终赋予文件或目录的初始权限。

    • umask默认权限的修改方法:umask 权限值可以通过如下命令直接修改:
    [root@CncLucZK test]# umask
    0022
    [root@CncLucZK test]# su - zk
    Last login: Sat Oct 15 23:12:21 CST 2022 on pts/0
    [zk@CncLucZK ~]$ umask
    0002
    [zk@CncLucZK ~]$ umask 0003
    [zk@CncLucZK ~]$ umask
    0003
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    不过,这种方式修改的 umask 只是临时有效,一旦重启或重新登陆系统,就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件 /etc/profile。例如:

    [root@CncLucZK test]# vi /etc/profile
    ...
    if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then
        umask 002
        #如果UID大于199(普通用户),则使用此umask值
    else
        umask 022
        #如果UID小于199(超级用户),则使用此umask值
    fi
    …
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 这是一段 Shell 脚本程序,规定了普通用户的 umask 由 if 语句的第一段定义,而超级用户 root 的 umask 值由 else 语句定义即可。 修改此文件,则 umask 值就会永久生效。

    参考文献:
    Linux 文件基本属性
    Linux权限位(超详细)

    下一篇:Linux学习-32-ACL访问控制权限
  • 相关阅读:
    go实现自定义rpc框架 (核心:服务端&客户端、自定义io流、编解码、服务发现、负载均衡、支持多语言网关等)
    合肥先进光源束测专用网络的规划-续
    【零基础学Python】Day2 Python基本语法
    c语言结构体与共用体
    素问·金匮真言论原文
    成功的程序化交易者需要具备什么技能?
    HarmonyOS 音频开发指导:使用 OpenSL ES 开发音频播放功能
    Spring复习大纲:依赖注入Ioc+Beans+注解+数据访问+AOP+MVC等
    Qt事件的详细介绍和原理
    Xshell使用技巧及常用配置
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/127786291