• Linux的文件权限管理


    Linux文件权限管理介绍

    一:Ubuntu 简介

    1 、什么是Ubuntu

    Ubuntu是基于Debian开发的一个开源的Linux操作系统,Ubuntu这个名字名称来⾃⾮洲南部某种语言的一个词语,Ubuntu每6个月会发布⼀个新版本,每隔两年,在四月份的时候,会推出⼀个⻓期⽀持版本(LTS)。其⽀持期⻓达五年,⽽⾮ LTS 版本的⽀持期通常只有半年。

    ubuntu的第⼀个版本是发布于2004 年,所以Ubuntu的⽣⽇是2004年的10⽉20⽇,后面Ubuntu版本的命名规则是根据正式版发布的年⽉命名,Ubuntu 16.04 也就意味着 2016年4⽉发布的Ubuntu。

    https://baike.baidu.com/item/ubuntu # Ubuntu历史版本⼀览表
    

    image

    2、使用ubuntu的场景

    • 桌面应用程序:Ubuntu 提供了一个易于使用的桌面环境,适合日常计算机使用。
    • 服务器:Ubuntu 是一个流行的服务器操作系统,因为它提供了高度可定制的安装选项,安全更新和广泛的应用程序支持。
    • 云计算:Ubuntu 在云计算中也很流行,因为它提供了云服务商所需的安全性、性能和可扩展性等关键功能。
    • 物联网:Ubuntu 可以作为 IoT 设备的操作系统,它提供了稳定的核心操作系统,同时也提供了与云服务连接和远程管理的工具。
    • 开发:Ubuntu 内置了各种编程语言和工具,适合开发者进行软件开发和测试

    3、Ubuntu 的软件管理

    刚开始的时候,开源软件最初只提供了源码,安装软件的时候需要自行编译安装,但是编译安装存在很多依赖,这样就造成了早期软件的部署困难。

    后面Debian诞生的时候,开发了一个包管理工具dpkg,通过将编译好的二进制文件、配置文件、库文件和帮助文件等信息封装在一个软件包里面,通过dpkg工具来进行快速安装。

    因为ubuntu是基于Debian开发而来的,所以ubutu也继承了Debian的软件包和包管理工具等。

    离线安装:

    如果是离线安装,就使用dpkg这个工具,并且dpkg只能用来管理本地的软件包,需要将指定的软件包下载到本地才可以使用dpkg进行管理,并且dpkg只能管理.deb格式的软件包。dpkg安装软件包的时候不会自动解决软件包之间的依赖关系。

    在线安装:

    如果是在线安装,就使用apt(Advanced Package Tool)这个工具,apt是一个高级软件包管理工具,只能在线管理软件包,只需要提供软家源就可以在线下载安装。并且可以自动解决软件包的依赖关系。apt工具也是基于dpkg开发而来的。

    dpkg 的使用

    # 安装
        # 通常用于查询已安装的软件包的信息。 -I
        sudo dpkg -I pacakage_name
     
    # 卸载删除
    	# 删除已经安装在系统上的软件包(包括配置文件) -P 或者 --purge 
    	sudo dpkg -p package_name
     
    # 查看
        # 用于查看系统中都装了哪些软件包  -l 或 list
        sudo dpkg -l 
    
        # 查看已安装的软件包的文件路径
        sudo dpkg -L  pacakage_name
    
        # 查询某个文件属于哪个软件包。 -S
        sudo dpkg -S file_name
    
        # 询软件包的基本信息,不需要详细信息 -s
        sudo dpkg -s package_name 
    
        # 查询软件包的详细信息 -p
        sudo dpkg -p package_name 
    

    例如:查看系统中是否已经安装了指定的软件包

    root@ubuntu:~# dpkg -l | grep redis
    ii  libhiredis0.14:amd64                       0.14.0-6                              amd64        minimalistic C client library for Redis
    ii  redis-server                               5:5.0.7-2ubuntu0.1                    amd64        Persistent key-value database with network interface
    ii  redis-tools                                5:5.0.7-2ubuntu0.1                    amd64        Persistent key-value database with network interface (client)
    

    例如:查询ls属于哪个软件包

    [root@ubuntu1804 ~]#dpkg -S /bin/ls
    coreutils: /bin/ls
    

    apt的使用

    apt这个工具是在ubuntu1604的LTS版本中引入的,引入apt以后,将之前的apt-get、apt-cache等工具对软件包的操作整合到一个命令中,使得软件包管理更加方便和简单。

    例如:

    # 更新软件包列表: update
    sudo apt update
    
    # 升级所有已安装的软件包: upgrade
    sudo apt upgrade
    
    # 安装一个或多个软件包: install
    sudo apt install package1 package2 ...
    
    # 卸载一个或多个软件包:	remove或purage
    sudo apt remove package1 package2 ...  # 只会卸载软件包,不会删除相关的配置文件
    sudo apt purge  package1 package2 ...  # 卸载软件包时,删除相关配置文件
    
    # 清理本地软件包缓存: clean
    sudo apt clean
    
    # 显示软件包之间的依赖关系: depends
    apt depends package_name
    
    # 只下载deb包和这个包的依赖,不进行安装  --download-only
    sudo apt --download-only install package_name
    
    # 查看下载的软件包和依赖: /var/cache/apt/archives/是默认的软件包下载目录
    ls /var/cache/apt/archives/
    

    例如:查看keepalived这个软件包的依赖信息

    # 查看某个软件包的依赖信息时,需要先在系统中安装了该软件包才能查看其依赖信息。
    [root@ubuntu1804 ~]#apt depends keepalived
    keepalived
     Depends: iproute2
       iproute2:i386
     Depends: libc6 (>= 2.27)
     Depends: libglib2.0-0 (>= 2.26.0)
     Depends: libip4tc0 (>= 1.6.0+snapshot20161117)
     Depends: libip6tc0 (>= 1.6.0+snapshot20161117)
     Depends: libnl-3-200 (>= 3.2.27)
     Depends: libnl-genl-3-200 (>= 3.2.7)
     Depends: libnl-route-3-200 (>= 3.2.7)
     Depends: libsnmp30 (>= 5.7.3+dfsg-1.8ubuntu3.1~dfsg)
     Depends: libssl1.1 (>= 1.1.0)
     Depends: libxtables12 (>= 1.6.0+snapshot20161117)
     Recommends: ipvsadm
    

    二:Linux目录结构

    Linux的哲学思想:

    • 一切皆文件(包括硬件):将设备也视为一个文件,使得用户可以使用相同的命令和工具来管理文件和设备
    • 配置存放在文本文件中:将配置保存在文本文件中,可以让配置的查看、编辑更加方便。

    1、Linux的目录结构

    image

    目录的功能:

    • bin:binary。的相关目录存放的是二进制程序(所有人都可执行的二进制文件)
    • sbin :super binary。 管理员可以执行的二进制文件
    • boot: 和计算机启动相关的文件,如内核等文件
    • dev: device。 存放硬件设备
    • etc:et cetera, 相当于windows的注册表,存放各种程序的配置文件
    • home: 普通用户的家目录
    • usr: 相当于第二个根(usr下面的文件夹根下面都有,相当于windows系统下的windows这个文件夹的功能
    • run: 系统运行过程中生成的临时文件
    • tmp: 临时文件
    • var:variety 。存放经常变化的内容 ,比如日志、网站
    • lib: library。存放库文件,程序的依赖等内容
    • proc: process 。存放进程相关的信息
    • sys: 和硬件相关的文件,数据存放在内存中的

    2、Linux文件的类型

    • - :普通文件
    • d :目录文件directory
    • l :符号链接文件link
    • b :块设备block ,例如硬盘文件,访问的时候是一块一块访问的
    • c :字符设备character。访问的时候是一个字符一个字符访问的
    • p : 管道文件pipe
    • s :套接字文件socket

    3、Linux 文件的颜色

    • 绿色: 可执行文件

    • 红色: 压缩文件、打包文件

    • 白色: 文本文件

    • 蓝色: 目录文件

    • 黄色: 设备文件

    • 浅蓝色: 链接文件(软连接)

    image

    Linux 查看文件的类型:

    方法一:通过颜色判断

    方法二:通过ls -l或者file命令查看

    三:Linux用户管理

    Linux用户分类:

    image

    相关文件:

    /etc/passwd:存储系统中所有用户的信息,例如用户名、用户ID、用户主目录和默认shell等

    可以通过查看/etc/passwd内容来确定系统是否存在指定的用户。

    # 查看passwd文件的方式
    root@ubuntu1804:~# cat /etc/shadow | grep nginx
    nginx:!:19339::::::
    
    # 使用id命令进行查看
    root@ubuntu1804:~# id nginx
    uid=999(nginx) gid=999(nginx) groups=999(nginx)
    
    

    /etc/shadow:存储用户的密码和其他敏感信息

    1、useradd

    useradd用于创建用户。

    #选项
    -s   # 指定该用户使用的shell类型
    -u   # 指定uid ,不指定默认从1000开始
    -r   # 创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。
           # 由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录
    -d   # 指定家目录,这个目录要提前存在
    -p   # 指定用户的密码(需要的是加密的密码,明文密码不可以
    -m   # 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的
    -g   # 指定用户所属于的主要组
    -G   # 指定用户的附加组。我们把用户加入其他组,一般都使用附加组;
    

    例如:创建一个普通用户指定家目录

    #创建一个普通用户指定家目录
    root@ubuntu1804:~# useradd -m bob 
    
    root@ubuntu1804:~# ll -d /home/bob/
    drwxr-xr-x 2 bob bob 4096 Dec  8 14:28 /home/bob//
    
    root@ubuntu1804:~# id bob 
    uid=1001(bob) gid=1001(bob) groups=1001(bob)
    

    例如:创建系统用户:

    # 1.先创建组 使用 -g指定gid
    # 2.创建系统用户 使用-r表示创建系统用户 使用 -u指定uid 使用-g指定组
    # 这样做的好处是多台服务器上创建的用户gid、uid保持一致
    
    #系统用户的uid和gid范围是1-999
    root@ubuntu1804:~# groupadd -g 666 bob
    
    root@ubuntu1804:~# useradd -r -s  /sbin/nologin -u 666 -g bob  user1
    
    root@ubuntu1804:~# id user1	
    uid=666(user1) gid=666(bob) groups=666(bob)  
    

    2、userdel

    userdel用于删除系统中指定的用户

    # userdel [-r] user_name 添加-r参数就删除用户的所有信息。
    
    root@ubuntu1804:~# userdel -r bob
    userdel: bob mail spool (/var/mail/bob) not found
    

    3、usermod

    更改用户的相关信息

    # 修改用户的用户名:使用 -l 选项:
    usermod -l 新用户名 老用户名
    
    # 修改用户的家目录:使用 -d 选项:
    usermod -d /新的/家目录 要修改的用户名
    
    # 修改用户的默认 shell:使用 -s 选项:
    usermod -s /bin/bash 要修改的用户名
    
    # 将用户添加到一个或多个附加组中:使用 -aG 选项,-a 选项表示将用户添加到附加组中,而不是替换用户的组
    usermod -aG 组名 要修改的用户名
    

    四:Linux 组管理

    在Linux中的每个用户必须属于一个组,不能独立于组外。一般创建用户的时候会以该用户的名称为组名创建一个用户组。

    相关文件;

    /etc/gshadow文件

    存储用户组的密码和其他敏感信息。

    /etc/group文件

    存储系统中所有用户组的信息,可以通过这个文件查看是否存在指定的用户组。

    /etc/login.defs文件

    用于配置Linux系统中各种登录相关的默认值和策略信息。

    1、groupadd

    用于创建一个用户组。

    例如:

    sudo groupadd group_name
    
    # 参数
    	-g:指定gid,未指定系统随机分配
    	-r:创建系统用户组,系统用户组通常用于管理系统进程和服务
    

    2、groupdel

    用于删除一个用户组。

    例如:

    sudo groupdel group_name
    
    # 参数
    	-f:强制删除,不管该组中是否还存在用户,慎用,强制删除可能会导致一些问题。
    	-r:删除组时,同时删除与该组相关的文件和目录
    

    3、groupmod

    用于修改一个组的信息。

    例如:

    sudo groupmod group_name
    
    # 参数
    	-g:设置用户的gid
    	-n:--new-name,修改组名
    

    五:Linux文件权限

    在Linux操作系统中,因为设计思想就是一切皆文件,所以可以针对文件或目录所设定的访问权限控制规则。这些权限规则可以控制不同用户或用户组对文件或目录的读、写、执行等操作权限。

    1、文件权限的组成

    由三部分组成:所有者权限、群组权限和其他用户权限。每个用户或用户组在访问文件或目录时,都会受到这三个权限规则的限制。

    说明:root用户例外。

    2、文件的权限属性

    Linux的文件权限属性用10个字符表示,分为四部分。

    • 第一部分:一个字符来表示文件的类型
    • 第二部分:三个字符表示文件的所有者
    • 第三部分:三个字符表示文件的所属组
    • 第四部分:三个字符表示文件的其它用户权限

    image

    权限属性说明:

    r(读)、w(写)、x(执行)和 -(无权限)

    普通文件

    • 读权限(r)表示可以读取文件内容。如果没有读权限,则用户无法查看文件内容
    • 写权限(w)表示可以修改文件内容,如没有写权限,则用户无法修改文件内容
    • 执行权限(x)表示可以将文件作为可执行文件执行,如果没有执行权限,则用户无法运行可执行文件

    目录文件:

    • 读取权限(r):表示允许查看目录中的文件列表。如果没有读取权限,则用户无法查看目录列表。
    • 写入权限(w):表示可以在目录中创建、删除、重命名、移动文件或目录
    • 执行权限(x):表示允许进入该目录。如果没有执行权限,则用户无法进入该目录。

    目录文件的最小权限:

    目录文件的最小权限是可执行权限,因为目录是一种特殊的文件类型,用于存储其他文件和目录。对于一个目录来说,必须拥有执行权限才能进入这个目录。

    如果一个目录没有执行权限,那么用户就不能进入这个目录,也就无法访问该目录下的任何文件或子目录,即使这些文件或子目录的访问权限是允许的,所以目录的最小权限是可执行权限。

    例如:执行 cp /etc/issue /data/dir/ 所需要的最小权限?

    /bin/cp     # 需要x权限,需要对cp有可执行的权限
    /etc/       # 需要x权限,需要进入到etc目录下
    /etc/issue  # 需要r权限,需要能读取issue文件的内容
    /data       # 需要x权限,需要能进入data目录下
    /data/dir   # 需要w,x权限,需要能进入dir目录,并且能在下面创建一个叫做issue的文件。
    

    3、文件所有者

    文件所有者指的是创建该文件的用户的UID或进程的UID,这个UID会被写入文件的元数据中作为文件的所有者属性,文件所有者属性不会随着文件的复制或移动而改变。

    如何理解文件所有者指的是创建该文件的用户的UID或进程的UID

    例如当tom用户执行touch命令创建一个文件A的时候,因为touch的本质就是一个用户空间的应用程序,当在终端中输入touch命令并按下回车键时。系统会为该命令创建一个新进程,并将该进程的有效用户ID设置为tom的UID,然后,该进程创建文件A时,文件A的所有者就会被设置为该进程的有效用户ID,也就是tom的UID。因此,文件A的所有者就是tom用户。

    如何理解文件的所有者和所属组不会随着文件的移动而改变:

    例如创建了一个新文件A,文件系统会为这个新文件A分配一个唯一的inode号,并在系统中为其分配空间,在文件系统中,每个文件都有一个与之相关联的inode数据结构,这个数据接口就是用来存放文件属性信息的包括文件所有者、所属组、权限等,创建文件的时候就把A文件的所有者属性写入文件的inode中了,当使用mv命令将文件从一个目录移动到另一个目录时,实际上是在文件系统中修改了文件的路径。文件本身的内容和属性不会被修改,包括文件的所有者和所属组。因此,无论您将文件移动到哪个目录,文件的所有者和所属组都将保持不变。

    注意:复制的本质就是创建一个新的文件,使用cp命令将文件复制到另一个目录中,则复制的文件将具有与原始文件相同的所有者和所属组。

    六:Linux文件权限管理

    Linux文件权限包含了普通权限,特殊权限,特殊属性和ACL。

    1、默认权限属性

    在Linux中,新建文件时,文件的默认权限由umask的值来进行控制。umask是一个权限掩码,它会在创建新文件时掩盖某些默认权限。

    • root用户:umask 默认值通常是 0022
    • 普通用户: umask 默认值通常是 0002
    # 查看umask默认值
    root@ubuntu1804:~# umask 
    0022
    

    如何计算文件的默认权限:

    普通文件默认权限: 666 - umask,如果值为奇数就 + 1

    目录文件默认权限 :777 - umask

    计算普通文件默认权限的时候结果是奇数需要 +1的原因:

    因为结果存在奇数,说明包含有可执行权限,所以需要 +1 来保证这个文件默认不具备可执行权限,保证系统的安全。

    计算普通文件使用666和计算目录使用777的原因:

    为了保证目录文件默认就有可执行权限,不然用户没法访问,因为只有拥有可执行权限的目录,才能让用户进入并访问该目录下的文件和子目录(目录的执行权限表示是否允许访问该目录)。

    普通文件不需要考虑可执行权限,拥有可执行权限太危险,所以就使用666(包含了读和写权限)来计算默认权限。

    root用户创建的文件权限和普通用户创建的文件权限不同的原因:

    root用户和普通用户的umask值默认是不同是为了保护系统的安全和完整性,并为不同的用户角色提供不同的默认权限。

    对于普通用户来说:只需要考虑对自己的文件和目录具有读、写、执行的权限,默认即拒绝组和其他用户的写权限。所以默认的umask是002。所以普通用户创建的文件和目录的默认权限是 664 和 775

    对于root用户来说:因为root用户具有系统管理的特权,需要确保文件和目录对所有用户都是可读的,但只有所有者才能修改或删除它们。所以默认的umask是022,所以root 用户创建的文件和目录的默认权限是 644 和 755

    一个文件是否能被删除取决于这个文件所在目录的权限:

    一个文件是否能被删除和自身权限无关,取决于这个文件所在的目录文件是否对执行删除操作的用户具有写权限。

    2、修改默认的权限

    chown工具

    用于更改文件或目录的所有者,同时也可以用于更改文件所属组。

    更改文件所有者:

    chown owner file_name
    
    # 将/home/user1/file.txt的所有者更改为user2
    chown user2 /home/user1/file.txt
    

    更改文件所属组:

    chown :group file_name 或 chown .group file_name
    

    更改文件所有者和所属组:

    chown ower:group file_name 或 chown ower.group file_name 
    

    更改一个目录文件以及目录文件中所有文件的属性:

    # 需要使用 -R 参数进行递归修改
    chown -R ower:group file_name 或 chown ower.group file_name 
    

    chgrp工具

    用于更改文件的所属组

    例如:更改文件或目录的所属组

    chgrp group_name file_name
    
    # 将/home/user1/file.txt的所属组更改为dev
    chgrp dev /home/user1/file.txt
    

    chmod工具

    方法一:符号法:

    # who opt permission(谁对谁做什么操作)
        who:u,g,o,a (a:all,所有)
        opt: + - = (=:会修改用户的所有权限)
        permission:r,w,x
      
      owner 属主, u
      group 属组, g
      other 其他, o
    
      r Readable
      w Writable
      x eXcutable
    

    例如:

    # 给文件所有者加上可执行权限
    chmod u+x filename 
    
    # 让文件所有者只有r的权限
    chmod u=r file_name 
    
    # 给文件所有者读写执行权限,给所属组读和执行权限,不给其它用户任何权限
    chmod u=rwx,g=rx,o= file_name
    

    方法二:数字表示法

    在Linux系统中,文件和目录的权限可以用数字表示法来表示。

    数字表示法由三个八进制数字组成,每个数字代表一个权限组,从左到右依次是文件所有者权限、文件所属组权限和其他用户权限。

    一个八进制数字可以表示三个二进制数字,意味着可以用二进制位表示一个权限标志。

    例如:如果一个文件的权限是755

    7 --> 111(0b) 
    5 --> 101(0b)
    5 --> 101(0b)
    
    # 这三个二进制数字从左到右分表表示读、写、执行三种权限属性。如果该位的状态为1表示具备对应的权限。
    

    例如:给文件所有者读写执行权限,所见所属组读权限,其它用户读权限

    chmod 754 file_name 
    

    3、文件的三种特殊权限

    SUID权限

    作用:允许一个普通用户以该文件所有者的权限来执行该文件。

    例如:

    普通用户使用 passwd 命令修改自己的密码时,需要访问 /etc/shadow 文件,但是该文件只有 root 用户才有权限访问。

    为了允许普通用户修改自己的密码,passwd 程序需要拥有 SUID 权限,这样普通用户在运行 passwd 程序时,就会暂时获得 root 用户的权限,可以访问 /etc/shadow 文件并修改自己的密码。

    ehigh@ubuntu:~$ ll /etc/shadow
    -rw-r----- 1 root shadow 1697 5月  24  2022 /etc/shadow
    
    ehigh@ubuntu:~$ ls -l /usr/bin/passwd
    -rwsr-xr-x 1 root root 68208 7月  15  2021 /usr/bin/passwd
    

    SGID权限

    作用:让用户在运行某些程序时暂时获得程序所属组的权限。

    例如:需要多个用户共享一个目录并保持目录下文件的访问权限时非常有用

    Sticky Bit权限

    作用:该目录下的文件只能由文件的所有者、目录的所有者以及超级用户删除或移动,其他用户无法删除或移动该目录下的文件。

    例如:linux系统的/tmp这个临时文件目录就设置了stick bit权限,只允许文件所有者删除这个文件。

    ehigh@ubuntu:~$ ll -d /tmp/
    drwxrwxrwt 24 root root 4096 3月  13 09:20 /tmp/
    

    4、三个特殊权限的设置

    SUID权限设置

    如果文件设置了 suid 权限,则在文件所有者的可执行权限的位置上会显示一个 s 字符。

    # 方法一:字符法:u+s
    chmod u+s filename  
    
    # 方法二:先写出传统权限 然后再加4
    # 比如: 传统权限是755 加suid权限后: 4755 ---> rwsr-xr-x
    chomod 4755 filename
    

    SGID权限设置

    如果文件设置了 sgid 权限,则在文件所属组的可执行权限的位置上会显示一个 s 字符。

    # 方法一:字符法:g+s
    chmod g+s filename
    
    # 方法二:数字法: 2
    # 比如:传统权限是755 加sgid权限后: 2755 ---> rwsr-xr-x
    chmod 2775 filename
    

    Sticky Bit权限设置

    如果文件设置了 sticky bit 权限,则在其他用户的可执行权限的位置上会显示一个 t 字符.

    # 方法一:字符法:o+t
    chmod o+t filename
    
    #方法二:数字法 1
    例如:原来的权限是744,设置了Sticky Bit权限后是 1744
    chmod 1744 filename
    

    5、文件的特殊属性

    因为文件的所有者、所属组和其它这三种权限是不会限制root用户的操作。

    root 用户是系统的超级管理员,具有最高的权限,可以执行任何操作,包括读、写、执行任何文件,即使该文件的权限是 000(即没有任何权限),root 用户也可以对其进行读写操作。

    所以有些时候为了防止root用户误操作一些数据,可以给文件设置一些特殊属性来限制对文件的删除、修改、追加等操作,从而保护文件的安全性。

    chattr工具

    可以通过charrt工具来设置文件的特殊属性。

    语法:

    # 格式
    	chattr [选项] [+/-][属性] 文件名
    
    # 选项:
        -R:递归处理目录下的所有文件和子目录
        -v:显示文件的属性设置过程
        
    # + -
    	+:表示添加这个属性
    	-:表示取消这个属性
    
    # 属性
        a:
        	# 普通文件:表示只允许追加到文件中,不允许其它修改、删除、移动等操作;
        	# 目录文件:表示只能在目录中建立和修改文件,但是不允许删除文件
        i:
        	# 普通文件:设置文件为不可修改,不可删除;
        	# 目录文件: 只能修改目录下文件中的数据,但不允许建立和删除文件
        	
       	u:文件删除后,数据内容还保存在磁盘中,可以使用恢复工具进行恢复,常用来防止意外删除文件或目录。
       	
    

    例如:

    # 设置文件为只读模式
    ehigh@ubuntu:~/test$ sudo chattr +i a.txt 
    ehigh@ubuntu:~/test$ sudo rm -rf a.txt 
    rm: cannot remove 'a.txt': Operation not permitted
    
    # 防止文件被删除或改变
    ehigh@ubuntu:~$ sudo chattr +a a.txt 
    ehigh@ubuntu:~$ echo 1234 >> a.txt 
    
    ehigh@ubuntu:~$ echo 1234 > a.txt 
    -bash: a.txt: Operation not permitted
    
    

    lsattr工具

    通过lsattr可以查看某个文件是否设置了特殊属性。

    例如:

    root@ubuntu1804:~# lsattr test 
    ----i---------e--- test
    

    6、ACL

    ACL:Access Control List,访问控制列表。一种在文件系统上控制文件和目录权限的机制。

    允许用户在不更改所有权或权限模式的情况下,对文件和目录进行更细粒度的控制。

    主要是用于实现单独给某个用户设置权限,因为chmod只能整体给文件所有者、所属组和其它用户设置权限。

    setfacl工具

    setfacl工具是Linux系统中用于设置文件和目录访问控制列表(ACL)的工具,ACL可以授予用户和组不同于标准Unix权限的访问权限。

    例如:

    设置acl:

    # 格式
    	setfacl -m u:username:rwx filename
    
    # 设置tom用户对A文件有读写执行的权限 
    	root@ubuntu1804:~# setfacl -m  u:tom:rwx A
    

    删除acl:

    # 删除某个文件所有的acl设置
    	setfacl -b filename
    
    # 删除ACL中的一个特定条目
    	setfacl -x u:username filename
    

    修改acl:

    # 格式
    	setfacl -m u:username:rx filename
    
    # 修改tom对A文件的权限为读和执行
    	root@ubuntu1804:~# setfacl -m  tom:r-x A
    

    getfacl工具

    使用getfacl可以查看一个文件是否设置了acl,以及acl的详细信息。

    # 格式
    	getfacl filename
    
    # 查看A文件的acl信息
        root@ubuntu1804:~# getfacl A
        # file: A
        # owner: root
        # group: root
        user::rw-
        user:tom:rwx 
        group::r--
        mask::rwx
        other::r--
    

    image

    7、mask

    mask 是用来限制了除了文件所有者和所属组之外的其他用户或组的权限,因为文件所有者和所属组本来就有文件所有权和群组权限,不受 ACL 权限的限制。

    说明:

    设置了acl后,使用ls -l命令查看文件权限时,所属组现实的权限是mask的值,真正的组的权限是getfacl中的group。

    #  原文件权限
    root@ubuntu1804:~# ll -l test 
    -rw-r--r-- 1 root root 10485760 Mar 13 15:23 test
    
    #设置acl 
    root@ubuntu1804:~# setfacl -m u:tom:rwx test 
    
    # 所属组权限这儿显示的是mask的值
    root@ubuntu1804:~# ls -l test 
    -rw-rwxr--+ 1 root root 10485760 Mar 13 15:23 test
    
    # group显示的才是所属组的权限
    root@ubuntu1804:~# getfacl test 
    # file: test
    # owner: root
    # group: root
    user::rw-
    user:tom:rwx
    group::r--
    mask::rwx
    other::r--
    

    总结:

    • 如果没有设置acl,那么使用ls -l 命令看到的权限属性就是文件所有者、文件所属组和其它用户的权限属性信息。
    • 如果设置了acl,使用ls -l命令查看的时候,原来文件所属组的位置显示的就是mask权限的值。

    七:文件权限的生效顺序

    不设置ACL,文件权限的生效顺序:

    从左到右匹配,匹配到了就不匹配了
    

    例如:

    文件A的权限是rw-rw-r,如果一个用户tom需要对A文件进行写操作,会先判断tom是否是A文件的所有者,如果是就不在匹配,不是就继续匹配。

    设置了ACL后,文件权限的生效顺序:

    文件件所有者 -->自定义的用户(单独给文件设置的acl权限) --> 文件所属组 --> 自定义的组(acl中定义的) --> other(其它用户)
    

    目录文件下的两个特殊文件:

    root@ubuntu1804:~/nginx-1.20.2# ls -a
    .  ..  auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
    
    # .  :表示的是当前文件的一个硬链接,
    # .. :表示的是当前文件所在目录的一个硬链接
    
    • . 代表当前目录,是当前目录的一个硬链接。
    • .. 代表上一级目录,是上级目录的一个硬链接。

    在linux中,创建一个文本文件链接数为1,创建一个目录文件链接数为2的原因:

    • 普通文件: 创建一个新文件时,链接数为1的原因是该文件自己就是自己的一个硬链接。
    • 目录文件:创建要给目录文件时,链接数为2的原因是创建新目录的同时会在这个目录的内部创建一个名字位 . 的硬链接

    例如:创建一个目录文件xx,使用stat命令查看该文件和该文件下的.文件,发现inode号相同,说明是同一个文件。

    image

  • 相关阅读:
    对表白的看法
    转岗项目经理后,我是如何管理项目的。
    大数 马蹄集
    基于PaddlePaddle框架对CIFAR-100数据集在简易CNN(LeNet-5修改)和简易DNN的效果对比
    House of orange
    2022年最新前端面试题
    openpnp - 手工修改配置文件(元件高度,size,吸嘴)
    Mac搭建anaconda环境并安装深度学习库
    《QA离业务代码能有多近?》通过codediff直接暴露缺陷
    xml学习
  • 原文地址:https://www.cnblogs.com/heyongshen/p/17213795.html