Linux笔记 Day13---(linux文件系统权限:权限位、基本权限ACL、特殊权限SUID和SGID;命令:chmod、chown、setfacl、getfacl、umask、)

由于绝大多数用户使用的是个人计算机,使用者一般都是被信任的人(如家人、朋友等)。在这种情况下,大家都可以使用管理员身份直接登录。但在服务器上就不是这种情况了,往往运行的数据越重要(如游戏数据),价值越高(如电子商城数据、银行数据),则服务器中对权限的设定就要越详细,用户的分级也要越明确。

和 Windows 系统不同,Linux 系统为每个文件都添加了很多的属性,最大的作用就是维护数据的安全。举个简单的例子,在你的 Linux 系统中,和系统服务相关的文件通常只有 root 用户才能读或写,就拿 /etc/shadow 这个文件来说,此文件记录了系统中所有用户的密码数据,非常重要,因此绝不能让任何人读取(否则密码数据会被窃取),只有 root 才可以有读取权限。

此外,如果你有一个软件开发团队,你希望团队中的每个人都可以使用某一些目录下的文件,而非团队的其他人则不予以开放。通过前面的学习我们知道,只需要将团队中的所有人加入新的群组,并赋予此群组读写目录的权限,即可实现要求。反之,如果你的目录权限没有设置好,就很难防止别有用心之人。

比如说,本来 root 用户才能做的开关机、新增或删除用户等命令,一旦允许任何人拥有这些权限,系统很可能会经常莫名其妙的挂掉。而且,万一 root 用户的密码被其他人获取,他们就可以登录你的系统,从事一些只有 root 用户才能执行的操作,这是绝不允许发生的。

因此,在服务器上,绝对不是所有的用户都使用 root 身份登录,而要根据不同的工作需要和职位需要,合理分配用户等级和权限等级(基于角色的访问控制)

一、Linux文件系统权限管理

Linux最优秀的地方之一就是多任务环境,为了让各个使用者具有较为安全的文件数据,因此文件的权限管理变得尤为重要

在LInux中一般将文件的可存取身份分为3类,分别是owner/group/others我们称为权限对象,且这三类身份都具有read/write/execute等权限,称为权限类型

(一)权限对象

1、文件拥有者

文件拥有者,我们也称为文件的属主,由于Linux系统是一个多任务多用户的系统,因此会有很多人来使用这部主机,为了考虑每个人的隐私,文件所有者这个权限就尤为重要。

2、群组

群组是权限中最有用的功能之一,群组简单理解就是用户组,类似于我们公司的各个部门之间,或者学校的班级之间的划分,每一个班级就是一个群组,群组内的资源是共享的,群组之间是相互隔离的。

3、其他人

对于非文件的拥有者,或者文件的所属组以外的人,称为其他人

(二)权限类型

ls -al可以列出文件的长属性

[dxk@admin ~]$ ll
总用量 4
drwxrwxr-x. 2 dxk dxk    6 7月  29 16:16 222
-rw-rw-r--. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh

文件信息分为:文件类型、权限、链接数、所属用户、所属用户组、文件大小、最后修改时间、文件名,具体的可以见下图。
在这里插入图片描述
文件类型:

  • d:文件夹

  • -:普通文件

  • l:链接(类似Windows的快捷方式)

  • b:块设备文件(例如硬盘、光驱等)

  • p:管道文件

  • c:字符设备文件(例如猫等串口设备)

  • s:套接口文件/数据接口文件
    在这里插入图片描述

Linux权限基于UGO模型进行控制;U代表User,G代表Group,O代表Other;每一个文件的权限基于UGO进行设置 Linux的基本权限分为读、写、执行(r、w、x),可用数字4、2、1来表示

权限位由9位组成,前3位表示文件拥有者的权限,中间3位表示文件所属用户组的权限,后3位表示其他用户的权限

属主:用户若是文件的主人,则匹配属主的权限,权限在文件的左三位,即第一个rwx

属组:用户与属组在同一个组,则匹配属组的权限,权限在文件的中三位,即第二个rwx

其他:用户既不是属主也不是属组,则匹配其他的权限,权限在文件的右三位,即第三个rwx

-:某一位置为空时显示-,表示不具备这个权限

比如:

drwxr-xr-x  2 root mail  4096 1月  12 03:44 account

表示文件夹account,root是他的所属拥有者,具有可读可写可执行的权限;mail是他的所属用户组,具有可读、可执行的权限,不具备可写的权限;其他用户针对这个文件夹具有可读、可执行的权限,不具备可写的权限

r、w、x权限说明

1.对于文件而言

权限 说明
r 可获取文件的数据
w 可修改文件数据
x 可以将此文件运行为进程

2.对于目录而言

权限 说明
r 可以使用ls命令获取其下的所有文件列表
w 可修改此目录下的文件列表;即创建或删除文件;
x 可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息

3.文件权限判断逻辑

①判断用户对文件的权限

前提条件:用户能够成功进入到文件所在的目录,即对操作的文件所在目录有x权限

例:这个test/目录,other即使有w权限(无x权限)不能在test/目录中删除、创建、修改文件
#删除文件:看用户是否具备对目录的w权限
(1)先判断用户是以什么身份删除文件,按照owner->group->other顺序进行匹配
(2)若是目录的属主,目录权限的左三位有w权限,删除文件成功,无w权限,删除失败
(3)若不是目录属主,但在目录的属组中,如果目录权限的中三位有w权限,则删除文件成功,无则失败
(4)若不是目录属主,也不在目录的属组中,如果目录权限的右三位有w权限,则删除文件成功,无则失败
#创建文件:和用户删除文件判断逻辑一致
#修改文件:看用户是否具备对修改的文件的w权限
(1)先判断用户是以什么身份修改文件,按照owner->group->other顺序进行匹配
(2)若是文件的属主,文件权限的左三位有w权限,修改文件成功,无w权限,修改失败
(3)若不是文件属主,但在文件的属组中,如果文件权限的中三位有w权限,则修改文件成功,无则失败
(4)若不是文件属主,也不在文件的属组中,如果文件权限的右三位有w权限,则修改文件成功,无则失败

②判断用户对目录的权限

前提条件:用户能够成功进入到目录所在的目录,即对操作的目录所在的目录有x权限

注:想要删除、创建、修改test/目录下的test/dir/目录,前提条件是对test/目录有x权限

#删除目录:看用户是否具备对上一级目录的w权限
(1)先判断用户是以什么身份删除文件,按照owner->group->other顺序进行匹配
(2)若是上一级目录的属主,上一级目录权限的左三位有w权限,删除目录成功,无w权限,删除失败
(3)若不是上一级目录属主,但在上一级目录的属组中,如果上一级目录权限的中三位有w权限,则删除目录成功,无则失败
(4)若不是上一级目录属主,也不在上一级目录的属组中,如果上一级目录权限的右三位有w权限,则删除目录成功,无则失败

#创建目录:和用户删除目录判断逻辑一致(包括改名、改时间戳)

#修改目录(在目录下创建、删除文件):看用户是否具备对修改的目录的w权限,与上一级目录是否有w权限无关
(1)先判断用户是以什么身份修改目录,按照owner->group->other顺序进行匹
(2)若是目录的属主,目录权限的左三位有w权限,修改目录成功,无w权限,修改失败
(3)若不是目录属主,但在目录的属组中,如果目录权限的中三位有w权限,则修改目录成功,无则失败
(4)若不是目录属主,也不在目录的属组中,如果目录权限的右三位有w权限,则修改目录成功,无则失败

二、权限管理命令

(一)chmod命令

修改文件或目录的权限

普通用户使用该命令修改文件权限的前提是该文件的所有者必须是自己,root用户不受限制

1.chmod命令使用数字修改文件权限

Linux 系统中,文件的基本权限由 9 个字符组成,以 rwxrw-r-x 为例,我们可以使用数字来代表各个权限,各个权限与数字的对应关系如下:

r --> 4
w --> 2
x --> 1

由于这 9 个字符分属 3 类用户,因此每种用户身份包含 3 个权限(r、w、x),通过将 3 个权限对应的数字累加,最终得到的值即可作为每种用户所具有的权限

拿 rwxrw-r-x 来说,所有者、所属组和其他人分别对应的权限值为:

所有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2 = 6
其他人 = r-x = 4+1 = 5

所以,此权限对应的权限值就是 765。

使用数字修改文件权限的 chmod 命令基本格式: chmod [-R] 权限值 文件名

-R(注意是大写)选项表示连同子目录中的所有文件,也都修改设定的权限

【例 1】

任何人对该文件都具有读、写、执行权限

[dxk@admin ~]$ ls -al mod_passwd.sh 
---x-w---x. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod 777 mod_passwd.sh 
[dxk@admin ~]$ ls -al mod_passwd.sh 
-rwxrwxrwx. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh

【例 2】
不让其他人查看和修改该文件

[dxk@admin ~]$ chmod 771 mod_passwd.sh 
[dxk@admin ~]$ ls -al mod_passwd.sh 
-rwxrwx--x. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh

2.chmod命令MODE表示法修改文件权限

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

基本格式:
在这里插入图片描述

①赋权表示法:直接操作一类用户的所有权限位rwx
u=
g=
o=
a=

赋权表示法会将指定的用户身份的之前的权限直接覆盖为等号右边所指定的权限,以前的权限便不存在

【例 1】

-rwxrwx--x. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod u=r mod_passwd.sh   #修改属主只有读权限
[dxk@admin ~]$ ls -al mod_passwd.sh 
-r--rwx--x. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod  g=w mod_passwd.sh    #修改属组只有写权限
[dxk@admin ~]$ ls -al mod_passwd.sh 
-r---w---x. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod o=w mod_passwd.sh     #修改取他人只有写权限
[dxk@admin ~]$ ls -al mod_passwd.sh 
-r---w--w-. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod a=w mod_passwd.sh      #修改所有人都只有执行权限 
[dxk@admin ~]$ ls -al mod_passwd.sh 
--w--w--w-. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh

【例 2】

[dxk@admin ~]$ chmod u=rw,g=x,o=r mod_passwd.sh   #属主具有读写权限,属组具有写权限,其他人具有读权限
[dxk@admin ~]$ ls -al mod_passwd.sh 
-rw---xr--. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh

②授权表示法:直接操作一类用户的一个权限位r,w,x
u+, u-
g+, g-
o+, o-

【例 1】

-rw---xr--. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod u+x mod_passwd.sh  #给属主增加写权限
[dxk@admin ~]$ ls -al mod_passwd.sh 
-rwx--xr--. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod g+r,o+w mod_passwd.sh  #属组增加读权限,其他人增加写权限
[dxk@admin ~]$ ls -al mod_passwd.sh 
-rwxr-xrw-. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod u-wx,g-x,o-w mod_passwd.sh   #属主去掉写、执行权限;属组去掉执行权限;其他人去掉执行权限
[dxk@admin ~]$ ls -al mod_passwd.sh 
-r--r--r--. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh
[dxk@admin ~]$ chmod u-w mod_passwd.sh   #这里只是想说明没有的权限就算去掉也不是受影响出错
[dxk@admin ~]$ ls -al mod_passwd.sh 
-r--r--r--. 1 dxk dxk 2006 7月  27 14:25 mod_passwd.sh

注意:普通用户仅能修改属主为自己的那些文件的权限

(二)chown命令

chown 命令,可以认为是 “change owner” 的缩写,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件(或目录)的所属组

默认情况下:只有root用户才可以使用该命令

当只需要修改所有者时,可使用如下 chown 命令的基本格式:

chown [-R] 所有者 文件或目录

-R(注意大写)选项表示连同子目录中的所有文件,都更改所有者。

如果需要同时更改所有者和所属组,chown 命令的基本格式为:

chown [-R] 所有者:所属组 文件或目录

当然,chown 命令也支持单纯的修改文件或目录的所属组,例如:

[root@admin ~]# ll test
-rw-r--r--. 1 root root 0 7月  30 16:41 test
[root@admin ~]# chown :dxk test
[root@admin ~]# ll test
-rw-r--r--. 1 root dxk 0 7月  30 16:41 test

但修改所属组通常使用 chgrp 命令

需要注意的一点是:使用 chown 命令修改文件或目录的所有者(或所属者)时,要保证使用者用户(或用户组)存在,否则该命令无法正确执行,会提示 “invalid user” 或者 “invaild group”

【例 1】
其实,修改文件的所有者,更多时候是为了得到更高的权限

##由root用户创建file文件
[root@admin ~]# touch file
[root@admin ~]# ll file
-rw-r--r--. 1 root root 0 7月  30 10:53 file  #文件的所有者是root,普通用户对该文件拥有只读权限
[root@admin ~]# chown dxk file   #修改文件的所有者为dxk用户
[root@admin ~]# ll file
-rw-r--r--. 1 dxk root 0 7月  30 10:53 file  
#这时dxk用户对这个文件就拥有了读、写权限

【例 2】

Linux 系统中,用户等级权限的划分是非常清楚的,root 用户拥有最高权限,可以修改任何文件的权限,而普通用户只能修改自己文件的权限(所有者是自己的文件)

[root@admin ~]# cd /home/dxk  #进入dxk用户的家目录下
[root@admin dxk]# touch file  #由root用户创建文件file
[root@admin dxk]# ll file
-rw-r--r--. 1 root root 0 7月  30 11:11 file   #文件的所有者和所属组都是root用户
[root@admin dxk]# su - dxk    #切换为dxk用户
上一次登录:四 7月 30 10:58:58 CST 2020pts/1 上
[dxk@admin ~]$ chmod 755 file      
chmod: 更改"file" 的权限: 不允许的操作 
[dxk@admin ~]$ chown dxk file
chown: 正在更改"file" 的所有者: 不允许的操作
[dxk@admin ~]$ exit     #退回到root身份
登出
[root@admin dxk]# chown dxk file     #由root用户把file文件的所有者改为dxk用户
[root@admin dxk]# su - dxk
上一次登录:四 7月 30 11:11:35 CST 2020pts/0 上
[dxk@admin ~]$ chmod 755 file  #dxk用户由于是file文件的所有者,所以才可以修改文件的权限
[dxk@admin ~]$ ll file
-rwxr-xr-x. 1 dxk root 0 7月  30 11:11 file

【例 3】

同时修改所有者和所属组

[root@admin dxk]# ll file
-rwxr-xr-x. 1 root root 0 7月  30 11:11 file
[root@admin dxk]# chown admin001:dxk file
[root@admin dxk]# ll file
-rwxr-xr-x. 1 admin001 dxk 0 7月  30 11:11 file

【例 4】
修改文件的属主

[root@admin test]# ll
总用量 0
-rw-r--r--. 1 dxk1 dxk 0 8月   8 15:22 file
[root@admin test]# chown admin001 file
[root@admin test]# ll
总用量 0
-rw-r--r--. 1 admin001 dxk 0 8月   8 15:22 file

修改文件的属组

[root@admin test]# ll file
-rw-r--r--. 1 admin001 dxk 0 8月   8 15:22 file
[root@admin test]# chown :admin002 file
[root@admin test]# ll file
-rw-r--r--. 1 admin001 admin002 0 8月   8 15:22 file

同时修改文件的属主和属组

[root@admin test]# ll file
-rw-r--r--. 1 dxk1 dxk 0 8月   8 15:22 file
[root@admin test]# chown admin001: file
[root@admin test]# ll file
-rw-r--r--. 1 admin001 admin001 0 8月   8 15:22 file

也可以:

[root@admin test]# ll file
-rw-r--r--. 1 dxk1 dxk 0 8月   8 15:22 file
[root@admin test]# chown admin001:admin001 file
[root@admin test]# ll file
-rw-r--r--. 1 admin001 admin001 0 8月   8 15:22 file

三、进程安全上下文

进程对文件的访问权限应用模型:

  • 进程的属主与文件的属主是否相同;如果相同,则应用属主权限;
  • 否则,则检查进程的属主是否属于文件的属组;如果是,则应用属组权限;
  • 否则,就只能应用other的权限;

Linux的进程安全上下文法则

启动进程的权限问题:(先不讨论特殊权限SBIT)能否启动一个可执行程序文件作为一个进程PID,取决于此用户是否对这个文件有可执行权限x

例:能否将/bin/cat执行为一个进程,取决于用户是否对此文件有x权限
/bin/cat的owner,group,other都具备x权限,所以都可以将此文件启动为一个进程

[root@admin ~]# ls -al /bin/cat
-rwxr-xr-x. 1 root root 48568 Jul 22 2020 /bin/cat

若进程启动成功,进程就拥有启动者对应的权限,进程对文件的访问(修改)权限,就是启动者对文件的访问(修改)权限
例:#/bin/cat /etc/sudoers :/bin/cat进程是否能读sudoers文件的内容,取决于进程是以谁的身份启动,进程启动者若是owner或group,则可读取sudoers文件,若是other,则不可读取

[root@admin ~]# ls -al /etc/sudoers
-r--r-----. 1 root root 3876 Jul 22 20:40 /etc/sudoers

四、基本权限ACL

ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制

它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。

既然是作为UGO权限管理的补充,ACL自然要有UGO办不到或者很难办到的本事,例如:

  1. 可以针对用户来设置权限
  2. 可以针对用户组来设置权限
  3. 子文件/目录继承父目录的权限

设置ACL:

用法: setfacl [-bkRd] [{-m|-x} acl参数] 文件/目录名

常用选项:

  • -m :配置后面的 acl 参数给文件/目录使用,不可与 -x 合用;
  • -x :删除后续的 acl 参数,不可与 -m 合用;
  • -b :移除所有的 ACL 配置参数;
  • -k :移除默认的 ACL 参数;
  • -R :递归配置 acl;
  • -d :配置“默认 acl 参数”,只对目录有效,在该目录新建的数据会引用此默认值;

查看文件的acl权限 : getfacl [-R] 文件/目录名

【例 1】针对用户设置ACL权限

[root@admin tmp]# touch aclfile   #root用户创建名为aclfile文件
[root@admin tmp]# ll aclfile     #查看该文件的权限信息 
-rw-r--r--. 1 root root 0 7月  30 11:37 aclfile   #其他人只有可读权限
[root@admin tmp]# su - dxk          #切换到dxk用户
上一次登录:四 7月 30 11:14:58 CST 2020pts/0 上      
[dxk@admin ~]$ echo "hello" > /tmp/aclfile        #没有写权限
-bash: /tmp/aclfile: 权限不够
[dxk@admin ~]$ exit     #切换到root用户
登出
[root@admin tmp]# setfacl -m u:dxk:rw aclfile     #赋权给dxk用户对文件aclfile的读写权限
[root@admin tmp]# ll aclfile     #查询权限信息时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
-rw-rw-r--+ 1 root root 0 7月  30 11:37 aclfile
[root@admin tmp]# getfacl aclfile    #使用getfacl命令查看该文件的acl权限信息
# file: aclfile
# owner: root
# group: root
user::rw-
user:dxk:rw-
group::r--
mask::rw-
other::r--

[root@admin tmp]# su - dxk     #验证赋权是否成功
上一次登录:四 7月 30 11:37:32 CST 2020pts/0 上
[dxk@admin ~]$ echo "hello" > /tmp/aclfile     
[dxk@admin ~]$ cat /tmp/aclfile    #成功执行,即说明对aclfile文件有写权限,赋权成功生效
hello 

这里有必要对getfacl的输出信息进行说明:

[root@admin tmp]# ll aclfile     
-rw-rw-r--+ 1 root root 0 7月  30 11:37 aclfile
[root@admin tmp]# getfacl aclfile    #使用getfacl命令查看该文件的acl权限信息
# file: aclfile      <-----文件名
# owner: root		 <-----文件的属主
# group: root		 <-----文件的属组
user::rw-			 <-----用户栏是空的,说明是属主的权限
user:dxk:rw-		 <-----用户dxk对该文件的权限
group::r--   		 <-----组名栏是空的,说明是所属组的权限
mask::rw-			 <-----mask权限
other::r--			 <-----其他人的权限

【例 2】针对用户组设置权限

和针对用户的设置几乎一样,把 u 换成 g 就行

[dxk@admin ~]$ mkdir mydir
[dxk@admin ~]$ ll -d mydir/
drwxrwxr-x. 2 dxk dxk 6 7月  30 11:58 mydir/
[dxk@admin ~]$ setfacl -m g:admin001:r mydir/
[dxk@admin ~]$ getfacl mydir/
# file: mydir/
# owner: dxk
# group: dxk
user::rwx
group::rwx
group:admin001:r--
mask::rwx
other::r-x

【例 3】设定默认 ACL 权限

setfacl -d 针对子文件/目录继承父目录的权限

[dxk@admin ~]$ mkdir Dir
[dxk@admin ~]$ ll -d Dir/
drwxrwxr-x. 2 dxk dxk 6 7月  30 12:05 Dir/
[dxk@admin ~]$ setfacl -m d:u:admin002:rwx Dir/
[dxk@admin ~]$ getfacl Dir/
# file: Dir/
# owner: dxk
# group: dxk
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:admin002:rwx
default:group::rwx
default:mask::rwx
default:other::r-x
#这次多出了一些以 default 开头的行,这些 default 权限信息只能在目录上设置,然后会被目录中创建的文件和目录继承。

下面分别在 Dir 目录下创建文件 testfile 和目录 testdir,并查看它们的 acl 权限:

[dxk@admin ~]$ cd Dir/
[dxk@admin Dir]$ touch testfile
[dxk@admin Dir]$ ll testfile
-rw-rw-r--+ 1 dxk dxk 0 7月  30 12:09 testfile
[dxk@admin Dir]$ getfacl testfile
# file: testfile
# owner: dxk
# group: dxk
user::rw-
user:admin002:rwx		#effective:rw-      解释:这里对admin002实际生效的权限是rw-,这和mask权限有关
group::rwx			#effective:rw-     解释:这里对属组实际生效的权限是rw-,同样这和mask权限有关
mask::rw-
other::r--
#testfile继承了父目录的acl权限,因此用户admin002对它同样有读写执行权限

说明:

mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理

在上面可以看出由于mask权限对于非目录文件来说为rw-,所以即使用户手动给admin002用户添加对该文件具有rwx权限也没有用,此时并不能说明 admin002 用户就拥有了对该文件的读、写和访问权限,还需要和 mask 权限对比,rwx不在 rw- 范围内,所以最后生效的是rw-权限。

其实 :这里将权限进行对比的过程,实则是将两权限(即mask权限和手动赋予的权限)做“按位相与”运算,最终得出的值,即为admin002 用户有效的 ACL 权限

mask 权限的功能:它将用户或群组所设定的 ACL 权限限制在 mask 规定的范围内,超出部分直接失效。

总结:
如果手动赋予的权限大于mask权限,则最后生效的ACL 权限是mask权限
如果手动赋予的权限小于mask权限,则最后生效的ACL 权限是手动赋予的权限


#可以看到子目录testdir也继承了父目录Dir的权限
[dxk@admin Dir]$ mkdir testdir
[dxk@admin Dir]$ ll -d testdir
drwxrwxr-x+ 2 dxk dxk 6 7月  30 12:09 testdir
[dxk@admin Dir]$ getfacl testdir/
# file: testdir/
# owner: dxk
# group: dxk
user::rwx
user:admin002:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:admin002:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

当然,我们可以手工给这两个文件分配 ACL 权限,但是如果在目录中再新建文件,都要手工指定,则显得过于麻烦。这时就需要用到默认 ACL 权限。

默认 ACL 权限的作用:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限

需要注意:默认 ACL 权限只对目录生效

【例 4】更改ACL权限

-m 选项用来更改文件和目录的ACL权限

  • 当一个用户或组的ACL权限不存在时,-m选项执行的是添加
  • 当一个用户或组的ACL权限已经存在时,-m选项执行的是更新操作

添加上面已演示过,下面演示更新操作:

[root@admin tmp]# getfacl aclfile
# file: aclfile
# owner: root
# group: root
user::rw-
user:admin001:rwx   #原权限为rwx
group::r--
mask::rwx
other::r--

[root@admin tmp]# setfacl -m u:admin001:r aclfile   
[root@admin tmp]# getfacl aclfile
# file: aclfile
# owner: root
# group: root
user::rw-
user:admin001:r--    #修改为 :r--
group::r--
mask::r--
other::r--

【例 5】递归 ACL 权限

setfacl -R:设定递归 ACL 权限
递归 ACL 权限指的是父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。

[root@admin ~]# tree
.
├── anaconda-ks.cfg
├── dir
│   ├── abc
│   ├── d1
│   ├── d2
│   ├── def
│   └── fgh
├── UserManage.sh
├── userrecord.txt
└── u.sh
3 directories, 7 files
[root@admin ~]# cd  dir
[root@admin dir]# ll
总用量 0
-rw-r--r--. 1 root root 0 7月  30 15:14 abc
drwxr-xr-x. 2 root root 6 7月  30 15:14 d1
drwxr-xr-x. 2 root root 6 7月  30 15:14 d2
-rw-r--r--. 1 root root 0 7月  30 15:14 def
-rw-r--r--. 1 root root 0 7月  30 15:14 fgh
[root@admin dir]# setfacl -m u:admin002:rwx -R dir/
[root@admin dir]# cd ..
[root@admin ~]# setfacl -m u:admin002:rwx -R dir/
[root@admin ~]# ll
总用量 16
-rw-------. 1 root root 1588 6月  29 17:12 anaconda-ks.cfg
drwxrwxr-x+ 4 root root   59 7月  30 15:14 dir
-rw-r--r--. 1 root root  489 7月  27 10:24 UserManage.sh
-rw-r--r--. 1 root root 3000 7月  27 10:25 userrecord.txt
-rw-r--r--. 1 root root   60 7月  26 17:23 u.sh
[root@admin ~]# getfacl dir/
# file: dir/
# owner: root
# group: root
user::rwx
user:admin002:rwx
group::r-x
mask::rwx
other::r-x
[root@admin ~]# cd dir
[root@admin dir]# ll
总用量 0
-rw-rwxr--+ 1 root root 0 7月  30 15:14 abc
drwxrwxr-x+ 2 root root 6 7月  30 15:14 d1
drwxrwxr-x+ 2 root root 6 7月  30 15:14 d2
-rw-rwxr--+ 1 root root 0 7月  30 15:14 def
-rw-rwxr--+ 1 root root 0 7月  30 15:14 fgh

给dir目录递归设置ACL权限后,其目录下的所有存在的文件都会继承dir的ACL权限

这里要搞清楚( ***** )

默认 ACL 权限指的是针对父目录中后续建立的文件和目录会继承父目录的 ACL 权限;递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录会继承父目录的 ACL 权限。

【例 6】删除ACL权限

setfacl -x ,删除指定的 ACL 权限

#首先给file文件创建多个ACL权限
[root@admin ~]# touch file
[root@admin ~]# ll file
-rw-r--r--. 1 root root 0 7月  30 15:30 file
[root@admin ~]# setfacl -m u:admin001:rw file
[root@admin ~]# setfacl -m u:admin002:rx file
[root@admin ~]# setfacl -m u:admin003:rwx file
[root@admin ~]# setfacl -m g:admin004:rwx file
[root@admin ~]# getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:admin001:rw-
user:admin002:r-x
user:admin003:rwx
group::r--
group:admin004:rwx
mask::rwx
other::r--
#删除file文件中admin001用户的ACL权限
[root@admin ~]# setfacl -x u:admin001 file
[root@admin ~]# getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:admin002:r-x
user:admin003:rwx
group::r--
group:admin004:rwx
mask::rwx
other::r--
#可以看到admin001用户的ACL权限已被删除

setfacl -b:删除指定文件的所有 ACL 权限

下面删除file文件中的所有ACL权限

[root@admin ~]# setfacl -b file
[root@admin ~]# getfacl file
# file: file
# owner: root
# group: root
user::rw-
group::r--
other::r--
#可以看到所有的ACL权限已被删除

递归删除所有ACL信息 setfacl -b -R
递归查看所有ACL信息 getfacl -R

如果是想删除一个目录下的所有文件的ACL权限(包括该目录的)

#首先可以使用getfacl -R查看该目录及所有子目录和子文件的ACL权限信息
[root@admin ~]# getfacl -R dir/
# file: dir/      #dir目录的ACL信息
# owner: root
# group: root
user::rwx
user:admin001:rwx
group::r-x
mask::rwx
other::r-x

# file: dir//def     #dir目录下的文件def的ACL信息
# owner: root
# group: root
user::rw-
user:admin001:rwx
user:admin002:rwx
group::r--
mask::rwx
other::r--

# file: dir//fgh      #dir目录下的文件fgh的ACL信息
# owner: root
# group: root
user::rw-
user:admin001:rwx
user:admin002:rwx
group::r--
mask::rwx
other::r--

# file: dir//d2     #dir目录下的文件d2的ACL信息
# owner: root
# group: root
user::rwx
user:admin001:rwx
user:admin002:rwx
group::r-x
mask::rwx
other::r-x
[root@admin ~]# setfacl -b -R dir/  #递归删除所有的ACL信息

【例 7】备份和恢复ACL权限

先将指定文件的ACL权限信息进行重定向到文件中进行备份 getfacl -R > file.bak
如果该文件的ACL权限信息被误删后,可以使用 setfacl --restore file.bak 进行恢复

[root@admin ~]# getfacl -R dir/ > acl.bak    #对dir目录及所有子文件的ACL权限信息进行备份
[root@admin ~]# cat acl.bak 
# file: dir/
# owner: root
# group: root
user::rwx
user:admin001:rwx
group::r-x
mask::rwx
other::r-x

# file: dir//def
# owner: root
# group: root
user::rw-
user:admin001:rwx
group::r--
mask::rwx
other::r--

# file: dir//fgh
# owner: root
# group: root
user::rw-
user:admin001:rwx
group::r--
mask::rwx
other::r--

# file: dir//d2
# owner: root
# group: root
user::rwx
user:admin001:rwx
group::r-x
mask::rwx
other::r-x
[root@admin ~]# setfacl -b -R dir/     #删除dir目录及所有子文件的ACL权限信息
[root@admin ~]# getfacl -R dir/
# file: dir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# file: dir//def
# owner: root
# group: root
user::rw-
group::r--
other::r--

# file: dir//fgh
# owner: root
# group: root
user::rw-
group::r--
other::r--

# file: dir//d2
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@admin ~]# setfacl --restore acl.bak      #恢复数据
[root@admin ~]# getfacl -R dir/
# file: dir/
# owner: root
# group: root
user::rwx
user:admin001:rwx
group::r-x
mask::rwx
other::r-x

# file: dir//def
# owner: root
# group: root
user::rw-
user:admin001:rwx
group::r--
mask::rwx
other::r--

# file: dir//fgh
# owner: root
# group: root
user::rw-
user:admin001:rwx
group::r--
mask::rwx
other::r--

# file: dir//d2
# owner: root
# group: root
user::rwx
user:admin001:rwx
group::r-x
mask::rwx
other::r-x

五、权限掩码umask

(一)概述

我们都知道在linux下创建一个文件或者目录之后是可以通过chmod等命令进行权限设置,来达到给当前用户、用户组用户以及其他用户分配不同的访问权限。

那么,我们新创建的目录和文件本身也是有它的默认权限的,这个默认权限是什么,就是由权限掩码umask所确定的。它的功能可以说与chmod刚好相反的,代表默认拿走的也就是说不要的权限

若没有文件掩码时,文件的默认权限为0666,文件夹的默认权限为0777

原因:

  • 创建文件一般是用来读写,所以默认情况下所有用户都具有读写权限,但是没有可执行权限,所以文件创建的默认权限为0666
  • 而文件夹的x权限表示的是打开权限,所以这个权限必须要有,所以文件夹的默认权限为0777。

作用:
上述的权限是在没有umask情况下的默认权限。但是系统为了保护用户创建文件和文件夹的权限,此时系统会有一个默认的用户掩码(umask),大多数的Linux系统的默认掩码为022。

用户掩码的作用是用户在创建文件时从文件的默认权限中去除掩码中的权限

文件创建之后的权限实际为:文件创建权限 = 默认权限(文件0666,文件夹0777) - umask

注意:之所以文件用666去减,表示文件默认不能拥有执行权限;如果减得的结果中有执行权限,则需要将其加1

这里要说明两点:

  1. 针对目录来说x权限代表可以进入该目录,所以说对于这个权限初始赋值是没什么问题的;
  2. 针对文件的x的权限代表执行,这个风险太高,所以一般权限初始赋值必须去掉x的;

所以说,umask是用来指定"目前用户在新建文件或者目录时候的权限值"。那我们如何得知或者设置这个umask?

(二)umask的查看

在linux下我们查看的方式有两种:

第一种:以数字形式查看

[root@admin ~]# umask
0022

上面四个数字代表是赋值初始化准备丢弃的权限。(相对应文件来说,x权限就算没说明出来要丢弃也必须默认丢弃)

  • 第一个数:0代表suid 丢弃的权限;(不常用,后面说明中均省略该位)

  • 第二个数:0代表本文件/目录拥有者什么权限都没丢弃(如果是文件,x权限除外);

  • 第三个数:2代表本文件/目录的用户组丢弃了w权限(如果是文件那么它的x权限也丢弃);

  • 第四个数:2代表本文件/目录的其他用户能使用的权限只有有r和x(文件除外)。

综合上面所说如果新创建一个文件那么它的权限是:-rw-w–w-- 即是:644

[root@admin ~]# touch test
[root@admin ~]# ll test
-rw-r--r--. 1 root root 0 7月  30 16:41 test
#644

如果新创建一个目录的话那么它的权限是:dwrxw-xw-x 即是:755

[root@admin ~]# mkdir testdir
[root@admin ~]# ll -d testdir
drwxr-xr-x. 2 root root 6 7月  30 16:41 testdir
#755

第二种:以符号形式查看

[root@admin ~]# umask -S
u=rwx,g=rx,o=rx

不用多说:u代表文件属主,g代表文件属组,o代表其他人;r是读权限,w是写权限,x是可执行权限

这个输出信息表示:当用户新建一个目录的话其默认权限为: rwxr-xr-x ,也就是755;当用户创建一个非目录的文件时去掉以上所有权限对象的w可执行权限,即为:rw-r–r--,也就是644

以上umask权限掩码是root用户下的,在普通用户下为:

[dxk@admin ~]$ umask
0002 
[dxk@admin ~]$ umask -S
u=rwx,g=rwx,o=rx

同理:
在普通用户下创建一个非目录的文件那么默认权限为rw-rw-r–,即664:

[dxk@admin ~]$ touch demo
[dxk@admin ~]$ ll demo
-rw-rw-r--. 1 dxk dxk 0 7月  30 16:55 demo

在普通用户下创建一个目录文件那么默认权限为rwxrwxr-x,即775:

[dxk@admin ~]$ mkdir demodir
[dxk@admin ~]$ ll -d demodir/
drwxrwxr-x. 2 dxk dxk 6 7月  30 16:56 demodir/

(三)权限掩码的设置

1.使用umask命令修改

umask 新的umask值

[dxk@admin ~]$ umask 0042   #设置新的umask值为0042
[dxk@admin ~]$ umask 
[dxk@admin ~]$ umask -S
u=rwx,g=wx,o=rx

新的umask值为0042,那么创建出来的目录文件默认权限为:rwx-wxr-x (即735)

[dxk@admin ~]$ mkdir dir2
[dxk@admin ~]$ ll -d dir2
drwx-wxr-x. 2 dxk dxk 6 7月  30 17:22 dir2

创建出来的非目录文件的默认权限为:rw–w-r–(即624)

[dxk@admin ~]$ touch 1.txt
[dxk@admin ~]$ ll 1.txt
-rw--w-r--. 1 dxk dxk 0 7月  30 17:22 1.txt

注意:这样修改的umask值只是临时的,退出当前shell后就会失效

2.写入文件中

若要全局生效,可以将umask值写入/etc/profile或者.bashrc文件中

[root@admin ~]# cat /etc/profile    #以下是系统默认写好的
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi

六、文件特殊权限SUID、SGID

(一)Set UID

当s权限出现在文件所有者的x权限位置上时,此时就被称为Set UID,简称为SUID

如/usr/bin/passwd这个文件的权限状态:“-rwsr-xr-x.”,

[dxk@admin ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月   1 11:57 /usr/bin/passwd

SUID的作用

1、SUID权限仅对二进制程序(binary program)有效;
2、执行者对于该程序需要具有x的可执行权限;
3、本权限仅在执行该程序的过程中有效(run-time);
4、执行者将具有该程序拥有者(owner)的权限。

SUID的目的:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。

功能:只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。

passwd就是一个很鲜明的例子,下面我们就来了解一下这相passwd执行的过程。

我们知道,系统中的用户密码是保存在/etc/shadow中的,而这个文件的权限是0(---------),

[dxk@admin ~]$ ll /etc/shadow
----------. 1 root root 13042 7月  28 22:18 /etc/shadow

在利用passwd命令修改用户密码过程中,关键是要把密码写入到/etc/shadow中。我们知道,除了root用户能修改密码外,用户自己同样也能修改密码。而普通用户对此文件却没有任何操作权限。为什么还能修改密码,就是因为这个SUID功能。

因为SUID的存在且其他人对此文件也有执行权限,这就意味着,任何一个用户都可以用文件所有者,也就是 root 的身份去执行 passwd 命令

下面就是passwd这个命令的执行过程:

1、因为/usr/bin/passwd的权限对任何的用户都是可以执行的,所以系统中每个用户都可以执行此命令。

[dxk@admin ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月   1 11:57 /usr/bin/passwd

2、而/usr/bin/passwd这个文件的权限是属于root的。

3、当某个用户执行/usr/bin/passwd命令的时候,就拥有了root的权限了(命令就是二进制文件)

4、于是某个用户就可以借助root用户的权力,来修改了/etc/shadow文件了。

5、最后,把密码修改成功。

换句话说,当普通用户使用 passwd 命令尝试更改自己的密码时,实际上是在以 root 的身份执行passwd命令,正因为 root 可以将密码写入 /etc/shadow 文件,所以普通用户也能做到。只不过,一旦命令执行完成,普通用户所具有的 root身份也随之消失

如果我们手动将 /usr/bin/passwd 文件的 SUID 权限取消,会发生什么呢?观察如下命令的执行过程:

[root@admin ~]# chmod u-s /usr/bin/passwd
#属主取消SetUID权限
[root@admin ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27856 4月   1 11:57 /usr/bin/passwd
[root@admin ~]# su - admin001
上一次登录:三 7月 29 10:16:08 CST 2020从 192.168.126.1pts/3 上
[admin001@admin ~]$ passwd
更改用户 admin001 的密码 。
为 admin001 更改 STRESS 密码。
(当前)UNIX 密码:
#看起来没有什么问题
新的 密码:
重新输入新的 密码:
passwd: 鉴定令牌操作错误
#最后密码没有生效

显然,虽然用户有执行 passwd 命令的权限,但无修改 /etc/shadow 文件的权限,因此最终密码修改失败。

注意,实验完成后,一定要再把 /usr/bin/passwd 文件的 SetUID 权限加上

[root@admin ~]# chmod u+s /usr/bin/passwd
[root@admin ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月   1 11:57 /usr/bin/passwd

那么,普通用户可以使用 cat 命令查看 /etc/shadow 文件吗?答案的否定的,因为 cat 不具有 SUID 权限,因此普通用户在执行 cat /etc/shadow 命令时,无法以 root 的身份,只能以普通用户的身份,因此无法成功读取。

展示位置:属主的执行权限位如果属主原本有执行权限,显示为小写s; 否则,显示为大写S;

[dxk@admin ~]$ ll passwd 
-rws--xr-x. 1 dxk dxk 27856 7月  30 17:33 passwd
[dxk@admin ~]$ chmod u-x passwd
[dxk@admin ~]$ ll passwd 
-rwS--xr-x. 1 dxk dxk 27856 7月  30 17:33 passwd

注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放在目录上

提示:SetUID权限设置不当,会给 Linux 系统造成重大安全隐患

前面的例子中,我们试验了将 passwd 命令取消 SUID 权限,这会导致 passwd 命令的功能失效。那么,如果我们手动给默认无 SetUID 权限的系统命令赋予 SetUID 权限,会出现什么情况呢?

比如说,我们尝试给 Vim或cat 赋予 SetUID 权限:

[root@admin ~]# chmod u+s /usr/bin/vim
[root@admin ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2337192 8月   9 2019 /usr/bin/vim
[root@admin ~]# chmod u+s /usr/bin/cat
[root@admin ~]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 54080 8月  20 2019 /usr/bin/cat

此时你会发现,即便是普通用户使用 vim或cat 命令,都会暂时获得 root 的身份和权限,例如,很多原本普通用户不能查看和修改的文件,竟然可以查看了,以 /etc/passwd 和 /etc/shadow 文件为例,普通用户也可以将自己的 UID 手动修改为 0,这意味着,此用户升级成为了超级用户。除此之外,普通用户还可以修改一些重要的系统文件,可以轻易地使系统瘫痪。

其实,任何只有管理员可以执行的命令,如果被赋予了 SetUID 权限,那么后果都是灾难性的

(二)Set GID

当s权限位于文件的所属用户组x权限位置上的话,就是Set GID,简称SGID

与 SUID 不同的是,SGID 既可以对文件进行配置,也可以对目录进行配置

1.SetGID(SGID)对文件的作用

同 SUID 类似,对于文件来说,SGID 具有如下几个特点:

  • SGID 只针对可执行文件有效,换句话说,只有可执行文件才可以被赋予 SGID 权限,普通文件赋予 SGID 没有意义。
  • 用户需要对此可执行文件有 x 权限;
  • 用户在执行具有 SGID 权限的可执行文件时,用户的群组身份会变为文件所属群组;
  • SGID 权限赋予用户改变组身份的效果,只在可执行文件运行过程中有效;

其实,SGID 和 SUID 的不同之处就在于,SUID 赋予用户的是文件所有者的权限,而 SGID 赋予用户的是文件所属组的权限,就这么简单

以 locate 命令为例,可以看到,/usr/bin/locate 文件被赋予了 SGID 的特殊权限,这就意味着,当普通用户使用 locate 命令时,该用户的所属组会直接变为 locate 命令的所属组,也就是 slocate

[root@admin ~]# ll /usr/bin/locate 
-rwx--s--x. 1 root slocate 40520 4月  11 2018 /usr/bin/locate

我们知道,locate 命令是用于在系统中按照文件名查找符合条件的文件的,当执行搜索操作时,它会通过搜索 /var/lib/mlocate/mlocate.db 这个数据库中的数据找到答案,看看此数据库的权限:

[root@admin ~]# ll /var/lib/mlocate/mlocate.db 
-rw-r-----. 1 root slocate 700853 7月  30 10:49 /var/lib/mlocate/mlocate.db

可以看到,mlocate.db 文件的所属组为 slocate,虽然对文件只拥有 r 权限,但对于普通用户执行 locate 命令来说,已经足够了。一方面,普通用户对 locate命令拥有执行权限,其次,locate 命令拥有 SGID 权限,这使得普通用户在执行 locate 命令时,所属组身份会变为 slocate,而 slocate 对 mlocate.db 数据库文件拥有 r 权限,所以即便是普通用户,也可以成功执行 locate 命令

注意:无论是 SUID,还是 SGID,它们对用户身份的转换,只有在命令执行的过程中有效,一旦命令执行完毕,身份转换也随之失效

2.SetGID(SGID)对目录的作用

当一个目录被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录的所属组,就使得用户在创建文件(或目录)时,该文件(或目录)的所属组将不再是用户的所属组,而使用的是目录的所属组。

也就是说,只有当普通用户对具有 SGID 权限的目录有 rwx 权限时,SGID 的功能才能完全发挥。比如说,如果用户对该目录仅有 rx 权限,则用户进入此目录后,虽然其有效群组变为此目录的所属组,但由于没有 x 权限,用户无法在目录中创建文件或目录,SGID 权限也就无法发挥它的作用。

【例 】

[root@admin ~]# cd /tmp
[root@admin tmp]# mkdir dtest      #建立测试目录
[root@admin tmp]# chmod g+s dtest     #给测试目录赋予SetGID权限
[root@admin tmp]# ll -d dtest
drwxr-sr-x. 2 root root 6 7月  30 21:06 dtest     #SetGID权限已生效
[root@admin tmp]# chmod 777 dtest		#给测试目录赋予777权限,让普通用户可以写
[root@admin tmp]# ll -d dtest
drwxrwsrwx. 3 root root 33 7月  30 21:10 dtest
[root@admin tmp]# su - dxk				#切换成普通用户dxk
上一次登录:四 7月 30 21:05:38 CST 2020从 192.168.126.1pts/1 上
[dxk@admin ~]$ grep dxk /etc/passwd /etc/group
/etc/passwd:dxk:x:1000:1000::/home/dxk:/bin/bash
/etc/group:dxk:x:1000:      #此用户的所属群组为 dxk
[dxk@admin ~]$ cd /tmp/dtest/       #普通用户进入测试目录
[dxk@admin dtest]$ touch abc
[dxk@admin dtest]$ mkdir childdir     #在此目录中创建新的文件 abc 和子目录 childdir
[dxk@admin dtest]$ ll
总用量 0
-rw-rw-r--. 1 dxk root 0 7月  30 21:10 abc
drwxrwsr-x. 2 dxk root 6 7月  30 21:10 childdir

可以看到,虽然是 dxk 用户创建的 abc 文件和 childdir 目录,但它们的所属组都不是 dxk(dxk 用户的所属组),而是 root(dtest 目录的所属组)。

猜你喜欢

转载自blog.csdn.net/weixin_45880055/article/details/107681524
今日推荐