1 文件通配符

  • 思考问题:我们想象这样的一个场景,在一个100T的磁盘中,有很多日志文件数量10w条左右,这个时候你如果ls一下这个目录下面的文件会发生什么情况?

    当前的终端可能要去取这10w条的文件名数据,那样系统可能会因此而出现卡顿,这种不是因为服务压力过大而造成的服务器卡顿我们应该适当的避免。我们找文件应该只是找我们想要的内容,而不是经常什么文件目录都看一下,那么我们如何快速的取找到我们想要的文件呢?这个就是接下来要讲到的文件通配符功能,能够快速的匹配我们我们想要查找的内容。

环境准备:

# 这次会在boot目录下面做测试
[root@centos8 /boot/test]# df -i /boot
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda3       65536   317 65219    1% /boot
# 造文件的方法1个是随机造这种比较真实,但是需要很久
[root@centos8 /boot/test]# for i in {1..65219} ;do  touch `cat /dev/urandom |tr -dc "[:alnum:]" |head -c5` ; done

# 或者偷懒的方式 方法2
[root@centos8 /boot/test]# touch {1..65536}

# 这里我们模拟一个场景,制造多个文件
[root@centos8 /boot/test]# ll |wc -l
65219

通配符的优势:

  1. 上面我们讲到的快速查找、匹配到我们想要的内容。

  2. 快速匹配上以后我们可以对同一个类型的文件进行批量化操作,比如复制a开头的文件等等。

通配符中采用特定的符号,来表示特定的含义,这种特定的符号我们称之为meta字符(即元字符)

常见的通配符如下:

* 匹配0个或者多个字符,但不匹配"." 开头的文件,即隐藏文件
? 匹配任意单个字符,一个汉字也算这里的一个字符哦。
~ 当前用户家目录,所以我们也可以cd ~
~USERNAME USERNAME用户的家目录
. 和 ~+ 当前工作目录 . 用的比较多
~- 前一个工作目录
[0-9] 匹配数字范围
[a-z] 一个字母,不区分大小写
[A-Z] 一个字母,不区分大小写
[lxh] 匹配列表中的任何一个字符
[^lxh] 匹配列表中的所有字符以外的字符

注意: [a-z] [A-Z]的匹配并不是我们想象的一样

[root@centos7 ~]# touch {a..z}.txt
[root@centos7 ~]# touch {A..Z}.txt

[root@centos7 ~]# ll [a-z].txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 a.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 A.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 b.txt
...
-rw-r--r--. 1 root root 0 Nov 22 15:18 y.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 Y.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 z.txt

[root@centos7 ~]# ll [A-Z].txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 A.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 b.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 B.txt
...
-rw-r--r--. 1 root root 0 Nov 22 15:18 Y.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 z.txt
-rw-r--r--. 1 root root 0 Nov 22 15:18 Z.txt

#从上面的结果看,这个其实是并不区分大小写。是先匹配的小写再大写。

# 想查找系统中有那些预定义的元字符:
[root@centos8 ~]# man 7 glob

上面我们看到了。字母的匹配跟我们想象的不太一样哦,那么能不能做到更加精确的匹配呢?

[:digit:] 任意数字,相当于0-9
[:lower:] 任意小写字母,表示a-z 真正意义上的a-z
[:upper:] 任意大写字母,表示A-Z 真正意义上的A-Z
[:alpha:] 任意大小写字母 相当于[a-Z]
[:alnum:] 任意数字或字母
[:blank:] 水平空白字符
[:space:] 水平或垂直空白字符 这个范围就比上面的[:blank:]大
[:punct:] 标点符号

范例:[ ] 和 { } 在匹配上的一些区别

[root@centos8 ~/test]# touch f1{3..5}

[root@centos8 ~/test]# ll f1{1..5}
ls: cannot access 'f11': No such file or directory
ls: cannot access 'f12': No such file or directory
-rw-r--r-- 1 root root 0 Nov 28 10:56 f13
-rw-r--r-- 1 root root 0 Nov 28 10:56 f14
-rw-r--r-- 1 root root 0 Nov 28 10:56 f15

[root@centos8 ~/test]# ll f1[1-5]
-rw-r--r-- 1 root root 0 Nov 28 10:56 f13
-rw-r--r-- 1 root root 0 Nov 28 10:56 f14
-rw-r--r-- 1 root root 0 Nov 28 10:56 f15

# 这里就能看到我们元字符 []就只是做了范围内所有的匹配,而{}是指定范围内有就做匹配到的,实际都没有匹配上会报错文件不存在。
# 元字符写法的注意事项:我们想匹配全小写字符
[root@centos7 ~]# ls file[:lower:].txt
filee.txt  filel.txt  fileo.txt  filer.txt  filew.txt
# 上面我们可以看到,元字符[:lower:],光写的话是匹配了这个[]里面的内容的,没有达到我们的实际想要的效果。这里我们要注意一定要记得多加一对[]
[root@centos7 ~]# ls file[[:lower:]].txt
filea.txt  filec.txt  filee.txt  fileg.txt  filei.txt  filek.txt  filem.txt  fileo.txt  fileq.txt  files.txt  fileu.txt  filew.txt  filey.txt
fileb.txt  filed.txt  filef.txt  fileh.txt  filej.txt  filel.txt  filen.txt  filep.txt  filer.txt  filet.txt  filev.txt  filex.txt  filez.txt

# 比较有无*功能区别
# 这里我们ls -a 会看到隐藏文件也出现了。这个是-a的选项的功能
[root@centos8 /home/lx]# ls -a 
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .cache  .mozilla  test  test_unincoed.txt


# 而这里我们加个* 就把.开头的内容全部过滤掉了,但是如果有下级目录也会被匹配进来,
[root@centos8 /home/lx]# ls -a *
test_unincoed.txt

test:
.  ..  adsf


# 如果你想只显示当前目录的,可以加个-d
[root@centos8 /home/lx]# ls -ad *
test  test_unincoed.txt

练习:

1、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 2、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。 3、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

# 注意这些文件可能没有,需要自己用touch命令创造
# 1、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录
[root@centos8 /home/lx]# ll /etc/[^[:alpha:]][[:alpha:]]*
-rw-r--r-- 1 root root 0 Nov 28 11:27 /etc/1affff
-rw-r--r-- 1 root root 0 Nov 28 11:22 /etc/1test123

# 2、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
[root@centos8 /home/lx]# mkdir /tmp/mytest1
[root@centos8 /home/lx]# cp -a /etc/p*[^0-9] /tmp/mytest1/
[root@centos8 /home/lx]# ll /tmp/mytest1/
total 56
drwxr-xr-x.  2 root root 4096 Nov  9 20:51 pam.d
-rw-r--r--.  1 root root   68 May 14  2019 papersize
-rw-r--r--   1 root root 2880 Nov 27 17:24 passwd
-rw-r--r--.  1 root root 2844 Nov 27 17:19 passwd-

# 3、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
[root@centos8 /home/lx]# cat /etc/issue|tr 'a-z' 'A-Z' 
\S
KERNEL \R ON AN \M

[root@centos8 /home/lx]# cat /etc/issue|tr 'a-z' 'A-Z' > /tmp/issue.out
[root@centos8 /home/lx]# cat /tmp/issue.out
\S
KERNEL \R ON AN \M

[root@centos8 /home/lx]# 

2 用户和组的概念

  • 为什么会有用户和组的?

    ​ 其实相对于计算机而言,认识的只是数字,而我们人认识的更多的是文字也就是名字,那么如何把这两者链接起来,就有了用户名和用户id这个概念。

  • 有用户和组的好处?

    ​ 我们其实使用计算机,无非就是使用它的计算资源,存放数据等,Linux是一个多终端、多人操作系统那么我们自己放在上面的数据要如何去区分这个是谁的?既然我们已经有了用户这个第一步,那么第二步我们也能从我们的身份上去做区分资源的使用情况,也就是区分用户的不同权限。

  • 用户和组的用法:

    ​ 既然我们有了身份即用户名,那么我们就可以对使用计算机的人验明正身,就是用账号密码的方式区分登录到计算机的人是否合法。也因为身份的功能,我们能够让用户在系统登录后得到类似token的东西来区分他所能拥有的权力,类似我们古代的兵权调度,需要兵符,也就是你手上的token。这个token就是你的授权。

2.1 用户

Linux中每个用户是通过 User Id (UID)来唯一标识的

  • 管理员:root, 0

  • 普通用户:1-60000 自动分配

  • 系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后)

    ​ 对守护进程获取资源进行权限分配

  • 登录用户:500+ (CentOS6以前), 1000+(CentOS7以后)

    ​ 给用户进行交互式登录使用

**注意:**从上面的分配我们可以看到。其实root不一定是管理员哦。只要谁id是0,谁就是老大,毕竟计算机比较单纯只认识数字不认识人。

2.2 用户组

Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。

  • 管理员组:root, 0

  • 普通组:

    • 系统组:1-499(CentOS 6以前), 1-999(CentOS7 以后), 对守护进程获取资源进行权限分配。
    • 普通组:500+(CentOS 6以前), 1000+(CentOS7 以后), 给普通用户登录系统使用。

组是个什么概念?

​ 组其实更多的相当于我们生活中职场的职位、岗位。你在这个组即这个部门,那么你就有这个部门的一些公用权限,当然我们是可以在多个部门的,但是即使我们有多个部门,但是我们一定会有一个自己主要的部门,这个部门就是我们的主组。

举例:

​ 利用组就可以继承相关组上面的权限,其实生活上就是你是运维组的,你就有运维组这个职位的权限。

​ 用户相当于员工,组相当于职位(一个人是可以在一个公司兼职多个职位的哦)比如这个人又是CTO、也是CEO

2.3 用户和组的关系

  • 用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
  • 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组

默认创建用户的行为:

  • linux创建用户的默认行为:当创建新用户时,会自动建一个和之同名的组。

  • windows创建用户的默认行为:把用户都加入到一个叫做Users的组里面。

image-20211128120530154

范例:

[root@centos8 ~]# id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
# 通过上面我们就看到postfix用户有个自己同名的主组,postfix。同时有个附加的组mail

概念讲完了。那么我们就开始我们的实操命令部分。

2.4 用户和组管理命令

我们知道Linux上一切皆文件,当然用户和组都有它对应的配置文件,也就意味这我们可以手动修改,但是为了防止修改出现错误,还是推荐我们使用相关的命令。下面我们介绍一下用户和组管理相关的命令:

用户管理命令

  • useradd
  • usermod
  • userdel

组帐号维护命令

  • groupadd
  • groupmod
  • groupdel

2.4.1 用户创建

useradd 命令可以创建新的Linux用户

useradd [options] USERNAME

常见选项:

-u UID
-o 配合-u 选项,不检查UID的唯一性
-g GID 指明用户所属基本组,可为组名,也可以GID
-c "COMMENT“ 用户的注释信息
-d HOME_DIR 以指定的路径(不存在)为家目录,如果存在会报错,并且不复制初始化文件。
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
-G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
-N 不创建私用组做主组,使用users组做主组(gid为100)
-r 创建系统用户 CentOS 6之前: ID<500,CentOS7 以后: ID<1000
	不创建家目录、邮箱,id在上面的指定范围
	指定了-r以后指定-d是没效果的,要用就用-m
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
-p 指定加密的密码,注意这个是加密过后的密码。不是明文密码

生产中建议用户的创建方式:

  1. 先创建指定的组id
  2. 再创建指定的用户id,然后用户加入刚创建的组

**注意:**生产中通常是多个服务器之间相互调度,所以uid、gid最好能保持一直,防止远程调度因为权限问题出错。

2.4.2 用户属性修改

usermod 命令可以修改用户属性

格式:

usermod [OPTION] USERNAME

常见选项:参数大致和useradd相同

-u UID: 新UID
-g GID: 新主组
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据,同时使用-m选项
-l login_name: 新的名字
-L: lock指定用户,在/etc/shadow 密码栏的增加 !
-U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限,即宽限期

2.4.3 删除用户

userdel 可删除Linux 用户

格式:

userdel [OPTION]... USERNAME

常用选项:

-f, --force 强制
	用户在登录的时候是不允许删除的,除非你确定要强制进行。
-r, --remove 删除用户家目录和邮箱

# 注意:我们平时删除用户是不会删除家目录和邮箱这些数据的,这样一来可以防止误删,但是也会带来隐患,因为你的uid是随机分配的话,可能现在删除了这个用户,后续某个用户得到了这个id,就会继承它的遗产,所以系统中存在没有属主、组的文件是很危险的。

2.4.4 设置密码

passwd 可以修改用户密码

格式:

passwd [OPTIONS] username

常用选项:

-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码,Ubuntu无此选项

范例:非交互式修改用户密码

# 红帽系列的 passwd 有一个可以从标准输入设定密码的功能。
[root@centos8 /data]# echo 123456 |passwd --stdin lx
Changing password for user lx.
passwd: all authentication tokens updated successfully.

# 通用的
[root@centos8 /data]# echo -e '123456\n123456' |passwd lx
Changing password for user lx.
New password: BAD PASSWORD: The password is shorter than 8 characters
Retype new password: passwd: all authentication tokens updated successfully.

解释一下现在存储真正密码文件的/etc/shadow的字段含义:

# 具体查看帮助的方式
[root@centos8 /data]# whatis shadow
shadow (5)           - shadowed password file
shadow (3)           - encrypted password file routines
[root@centos8 /data]# man 5 shadow

# 其中摘要
login name
encrypted password
date of last password change
minimum password age
maximum password age
password warning period
password inactivity period
account expiration date
reserved field

# 这里我们找实际文件中的一段来解释
lx:$6$pr8ZQA3KC7T3FftW$ltL6nEl6py922xtHhqAnY6Ee54/tMDfHdjNxAecVZTUZp1XIDWgCrQjYzd9hFVg8OtIX6GLVsBVVvwpBVVLNO1:18960:0:99999:7:::
  1. 登录名
  2. 加密后的密码(这里是真正存放密码的地方要和/etc/passwd文件做好区分)
  3. 最后一次修改密码的日期(乘以一天86400s,可以得到一个时间戳,相对于1970年)
  4. 最短密码有效期,单位为天数
  5. 最长密码有效期,单位为天数
  6. 密码最长有效期快到前多少天提示用户修改密码,也称之为警告期,单位为天数
  7. 密码最长有效期到了以后,密码的宽限期,单位为天数
  8. 账户有效期
  9. 保留字段

2.4.5 创建组

groupadd实现创建组

格式:

groupadd [OPTION]... group_name

常见选项:

-g GID 指明GID号
-r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后: ID<1000

2.4.6 修改组属性

groupmod 组属性修改

格式:

groupmod [OPTION]... group_name

常见选项:

-n group_name: 新名字
-g GID: 新的GID

2.4.7 组删除

groupdel 可以删除组

格式

groupdel [options] group_name

常见选项:

-f, --force 强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录

2.4.8 练习

(1)、创建组distro,其GID为2019;
[root@centos8 ~]# groupadd -g 2019 distro
[root@centos8 ~]# getent group distro
distro:x:2019:

(2)、创建用户mandriva, 其ID号为1005;基本组为distro;
[root@centos8 ~]# useradd -u 1005 -g distro mandriva
[root@centos8 ~]# id mandriva
uid=1005(mandriva) gid=2019(distro) groups=2019(distro)


(3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
[root@centos8 ~]# useradd -u 1100 -d /home/linux mageia
[root@centos8 ~]# ll -a /home/linux
total 12
drwx------   3 mageia mageia  78 Nov 28 14:16 .
drwxr-xr-x. 12 root   root   138 Nov 28 14:16 ..
-rw-r--r--   1 mageia mageia  18 Jan 12  2021 .bash_logout
-rw-r--r--   1 mageia mageia 141 Jan 12  2021 .bash_profile
-rw-r--r--   1 mageia mageia 376 Jan 12  2021 .bashrc
drwxr-xr-x   4 mageia mageia  39 Nov  6 21:08 .mozilla  
[root@centos8 ~]# getent passwd mageia
mageia:x:1100:1100::/home/linux:/bin/bash


(4)、给用户mageia添加密码,密码为mageedu,并设置用户密码7天后过期
[root@centos8 ~]# echo mageedu |passwd --stdin mageia
Changing password for user mageia.
passwd: all authentication tokens updated successfully.

[root@centos8 ~]# getent shadow mageia
mageia:$6$QgWWs/yGU0bGysJ/$/jlwlZDcUbXMjrjZ0vgFUhJbfbW7raOTZTaBdbNjRPvmJmAp3CDA8txI9QFgYzpmsWUC5BX3F46df/TtLSLF00:18959:0:99999:7:::
[root@centos8 ~]# passwd -x 7 mageia
Adjusting aging data for user mageia.
passwd: Success
[root@centos8 ~]# getent shadow mageia
mageia:$6$QgWWs/yGU0bGysJ/$/jlwlZDcUbXMjrjZ0vgFUhJbfbW7raOTZTaBdbNjRPvmJmAp3CDA8txI9QFgYzpmsWUC5BX3F46df/TtLSLF00:18959:0:7:7:::


(5)、删除mandriva,但保留其家目录;
[root@centos8 ~]# ll -a /home/mandriva/
total 12
drwx------   3 mandriva distro  78 Nov 28 14:12 .
drwxr-xr-x. 12 root     root   138 Nov 28 14:16 ..
-rw-r--r--   1 mandriva distro  18 Jan 12  2021 .bash_logout
-rw-r--r--   1 mandriva distro 141 Jan 12  2021 .bash_profile
-rw-r--r--   1 mandriva distro 376 Jan 12  2021 .bashrc
drwxr-xr-x   4 mandriva distro  39 Nov  6 21:08 .mozilla
[root@centos8 ~]# userdel mandriva
[root@centos8 ~]# ll -a /home/mandriva/
total 12
drwx------   3 10050 distro  78 Nov 28 14:12 .
drwxr-xr-x. 12 root  root   138 Nov 28 14:16 ..
-rw-r--r--   1 10050 distro  18 Jan 12  2021 .bash_logout
-rw-r--r--   1 10050 distro 141 Jan 12  2021 .bash_profile
-rw-r--r--   1 10050 distro 376 Jan 12  2021 .bashrc
drwxr-xr-x   4 10050 distro  39 Nov  6 21:08 .mozilla
# 删除用户,默认家目录是不删除的。

(6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
[root@centos8 ~]# getent group peguin
# peguin 这个附加组没有。所以我们提前创建
[root@centos8 ~]# groupadd peguin
[root@centos8 ~]# useradd -u 2002 -g distro -G peguin slackware
[root@centos8 ~]# id slackware
uid=2002(slackware) gid=2019(distro) groups=2019(distro),2020(peguin)



(7)、修改slackware的默认shell为/bin/tcsh;
[root@centos8 ~]# getent passwd slackware
slackware:x:2002:2019::/home/slackware:/bin/bash
[root@centos8 ~]# usermod -s /bin/tcsh slackware
[root@centos8 ~]# getent passwd slackware
slackware:x:2002:2019::/home/slackware:/bin/tcsh


(8)、为用户slackware新增附加组admins,并设置不可登陆。
[root@centos8 ~]# getent group admins
[root@centos8 ~]# groupadd admins
[root@centos8 ~]# getent group admins
admins:x:2021:
# admins 不存在需要提前创建
[root@centos8 ~]# id slackware
uid=2002(slackware) gid=2019(distro) groups=2019(distro),2020(peguin)
[root@centos8 ~]# usermod -Ga peguin,admins slackware
usermod: group 'a' does not exist
# 这里需要注意参数顺序
[root@centos8 ~]# usermod -aG peguin,admins slackware
[root@centos8 ~]# id slackware
uid=2002(slackware) gid=2019(distro) groups=2019(distro),2020(peguin),2021(admins)

# 不能登录可以有两个方式
# 方法1,用passwd锁定密码,也就不能登录了
[root@centos8 ~]# getent shadow slackware
slackware::18959:0:99999:7:::
[root@centos8 ~]# passwd -l slackware
Locking password for user slackware.
passwd: Success
[root@centos8 ~]# getent shadow slackware
slackware:!!:18959:0:99999:7:::

# 方法2,让用户使用的默认shell为不可以登录的shell
[root@centos8 ~]# getent passwd slackware
slackware:x:2002:2019::/home/slackware:/bin/tcsh
[root@centos8 ~]# usermod -s /usr/sbin/nologin slackware
[root@centos8 ~]# getent passwd slackware
slackware:x:2002:2019::/home/slackware:/usr/sbin/nologin

3 facl的讲解

3.1 访问控制列表 ACL

为什么要有这个ACL这个功能?

​ 因为我们对文件的权限管理,只有三个部分,属主、属组、other。对于这样的三类并不够精细,我们想要对文件的权限进行更加精细的划分的时候没办法实现,所有就有了acl这个功能。

  • ACL:Access Control List,实现灵活的权限管理

    ​ 除了文件的所有者,所属组和其它人,可以对更多的用户设置权限

  • CentOS7 默认创建的xfs和ext4文件系统具有ACL功能

  • CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加

有了ACL后文件权限的生效顺序:

所有者 --> ACL自定义用户 --> 所属组 --> ACL自定义组 --> 其他人other

3.2 ACL相关命令

setfacl 可设置ACL权限 getfacl 可查看设置的ACL权限

# 设置
[root@centos8 data]#setfacl -m u:wang:0 f1.txt
[root@centos8 data]#setfacl -m g:admins:w f1.txt
# 获取
[root@centos8 /data]# getfacl test
# file: test
# owner: user1
# group: user1
user::rwx
user:user2:rwx
group::r-x
mask::rwx
other::r-x
#清除所有ACL权限
setfacl -b dir1
-R 递归

mask 权限

  • mask只影响除了所有者和other的之外的人、组的最大权限。

  • mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

  • 用户或组的设置必须存在于mask权限设定范围内才会生效

  • mask相当于一个门槛,设置的特殊权限最大不能超过这个门槛的高度。

setfacl -m mask::rx file

其实对于文件的权限,跟多的是看其归属,属主、组,因为是谁归属的,更大的处置权就在他们身上。

练习:

# 环境准备
# 创建用户user1、user2、user3。在/data/下创建目录test
[root@centos8 ~]# useradd user1
[root@centos8 ~]# useradd user2
[root@centos8 ~]# useradd user3
[root@centos8 ~]# mkdir -pv /data/test
mkdir: created directory '/data/test'

(1)、目录/data/test属主、属组为user1
[root@centos8 ~]# chown user1.user1 /data/test
[root@centos8 ~]# ll -d /data/test
drwxr-xr-x 2 user1 user1 6 Nov 28 15:09 /data/test


(2)、在目录属主、属组不变的情况下,user2对文件有读写权限
[root@centos8 ~]# setfacl -m u:user2:rwx /data/test
# 这里我们直接跟全路径发现会报错哦。
[root@centos8 /data]# getfacl /data/test
getfacl: Removing leading '/' from absolute path names
# file: data/test
# owner: user1
# group: user1
user::rwx
user:user2:rwx
group::r-x
mask::rwx
other::r-x

# 上面getfacl的用法不太对,我们直接相对路径就好了。
[root@centos8 /data]# getfacl test
# file: test
# owner: user1
# group: user1
user::rwx
user:user2:rwx
group::r-x
mask::rwx
other::r-x
# 有个特殊权限会看到权限位有个+号哦。
[root@centos8 ~]# ll -d /data/test
drwxrwxr-x+ 2 user1 user1 6 Nov 28 15:09 /data/test


[root@centos8 /data/test]# su user1
[user1@centos8 /data/test]$ touch a{1..4}.sh
[user1@centos8 /data/test]$ ll
total 0
-rw-rw-r-- 1 user1 user1 0 Nov 29 10:05 a1.sh
-rw-rw-r-- 1 user1 user1 0 Nov 29 10:05 a2.sh
-rw-rw-r-- 1 user1 user1 0 Nov 29 10:05 a3.sh
-rw-rw-r-- 1 user1 user1 0 Nov 29 10:05 a4.sh


(3)、user1在/data/test目录下创建文件a1.sh, a2.sh, a3.sh, a4.sh,设置所有用户都不可删除1.sh,2.sh文件、除了user1及root之外,所有用户都不可删除a3.sh, a4.sh
# 创建文件
[root@centos8 ~]# su user1 -c 'touch /data/test/a{1..4}.sh'
[root@centos8 /data]# ll test
total 0
-rw-r--r-- 1 user1 user1 0 Nov 29 22:05 a1.sh
-rw-r--r-- 1 user1 user1 0 Nov 29 22:05 a2.sh
-rw-r--r-- 1 user1 user1 0 Nov 29 22:05 a3.sh
-rw-r--r-- 1 user1 user1 0 Nov 29 22:05 a4.sh


# 用户是否有删除文件的权限,取决于上级目录的权限,上道题我们给user2设置了特殊权限这里我们取消就好了
[root@centos8 /data]# getfacl test
# file: test
# owner: user1
# group: user1
user::rwx
user:user2:rwx
group::r-x
mask::rwx
other::r-x


[root@centos8 /data]# setfacl -x u:user2 test
# 这里我们就看到只有属主user1 和 root能删除test目录下的文件了,也就是目录的写入权限。
[root@centos8 /data]# getfacl test
# file: test
# owner: user1
# group: user1
user::rwx
group::r-x
mask::r-x
other::r-x


# 设置所有用户都不能删除,我们可以通过chattr,添加特殊权限
[root@centos8 /data/test]# lsattr a3.sh a4.sh
-------------------- a3.sh
-------------------- a4.sh
[root@centos8 /data/test]# chattr +i a3.sh a4.sh
[root@centos8 /data/test]# lsattr a3.sh a4.sh
----i--------------- a3.sh
----i--------------- a4.sh
[root@centos8 /data/test]# rm a3.sh 
rm: remove regular empty file 'a3.sh'? y
rm: cannot remove 'a3.sh': Operation not permitted
# 添加上特殊权限后我们看到即使是root也是没有权限删除的。

(4)、user3增加附加组user1,同时要求user1不能访问/data/test目录及其下所有文件
[root@centos8 /opt/test]# usermod -G user1 user3
[root@centos8 /opt/test]# id user3
uid=2005(user3) gid=2005(user3) groups=2005(user3),2003(user1)
[root@centos8 /opt/test]# id user1
uid=2003(user1) gid=2003(user1) groups=2003(user1)

# 我们记得user1是test目录的属主和属组,所以为了实现效果,我们可以修改user1对test目录的属主权限
[root@centos8 /data]# ll -d test
drwxr-xr-x+ 2 user1 user1 58 Nov 29 22:10 test
[root@centos8 /opt]# chmod u-rwx test/
[root@centos8 /opt]# ll -d test/
d---r-xr-x+ 2 user1 user1 45 Nov 29 21:30 test/

# 验证一下,确实已经访问不了,即使user1是test目录的属组,但是它会先执行属主匹配到的权限。
[root@centos8 ~]# su - user1
[user1@centos8 ~]$ cd /data/test/
-bash: cd: /data/test/: Permission denied
[user1@centos8 ~]$ ll /data/test/al.sh
ls: cannot access '/data/test/al.sh': Permission denied

(5)、清理/data/test目录及其下所有文件的acl权限
[root@centos8 /data]# getfacl test
# file: test
# owner: user1
# group: user1
user::---
group::r-x
mask::r-x
other::r-x
[root@centos8 /data]# setfacl -bR test/
[root@centos8 /data]# getfacl test
# file: test
# owner: user1
# group: user1
user::---
group::r-x
other::r-x

2021年11月29日 22点22分