马哥博客作业第二周

# 第五章用户组和权限管理

```bash
#家目录,一个神奇的目录
```

## 知识碎片

1. sync将当前内存的数据强制写入磁盘

2. date +%s 显示从元年到现在距离现在多少秒

3. ubantu用户默认root用户无法直接登录,需要先用普通用户登录,然后sudo -i切换成root用户。因为root的shadow密码一列被锁定了,可以只root用户设置密码,下次就可以直接以root身份登录了。

4. 不可登录的shell类型除了/bin/nologin还有/bin/false

5. 神奇的家目录,家目录只有用户自己有读写执行权限,属组,其他人没有任何权限

6. 神奇的/tmp目录,是1777权限

```bash
[root@CentOS7ceshi data]$ll -d /tmp
drwxrwxrwt. 13 root root 4096 Mar 28 08:42 /tmp
```

## 用户管理

### 1.id命令

```bash
[root@CentOS7ceshi data]$id postfix #直接输入id的话就是查看当前用户id
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)#postfix账户在postfix的主组,mail的附件组里面
```

### 2.gent命令。

对/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow文件的直接快速查看。可以不用加绝对路径

```bash
[root@CentOS7ceshi data]$getent passwd root
root:x:0:0:root:/root:/bin/bash
[root@CentOS7ceshi data]$getent shadow root
root:$6$6CoMvJu8FJebUeHM$I7GNkeRELFojRtDYaHD/ar5C/914PtageSEX19j5rts/navj0ZKP3Ppfnn.GzUE18uUoY4pZe50soVVgpUtsb1::0:99999:7:::
[root@CentOS7ceshi data]$getent group root
root:x:0:
```

### 3.useradd创建新用户

格式:useradd [options] LOGIN

常见选项:

-u UID
-o 配合-u 选项,不检查UID的唯一性
-g GID 指明用户所属基本组,可为组名,也可以GID。==组名或者gid必须事先存在。==
-c "COMMENT“ 用户的注释信息
==-d HOME_DIR 以指定的路径(不存在)为家目录==
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
==-G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在==
==-N 不创建私用组做主组,使用users组做主组==
==-r 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000==
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户

范例1:

```bash
[root@CentOS7ceshi ~]$groupadd fujiagroup
[root@CentOS7ceshi ~]$getent group fujiagroup lijun
fujiagroup:x:1001:
lijun:x:8888: #当前有fujiangroup和lijun两个组
#测试创建新用户时主组和附加组必须是事先存在
[root@CentOS7ceshi ~]$useradd -u 8888 -g 8888 -d /lijun -c "one number of grouplijun" -s /bin/bash -G fujiagroup xiaolige
#上面,注意要点:测试创建新用户时主组和附加组必须是事先存在,bash要写绝对路径
[root@CentOS7ceshi ~]$id xiaolige
uid=8888(xiaolige) gid=8888(lijun) groups=8888(lijun),1001(fujiagroup)
[xiaolige@CentOS7ceshi ~]$getent group lijun fujiagroup ;getent passwd xiaolige
lijun:x:8888: #group和gshadow字段最后一位是显示以这个组为附加组的成员
fujiagroup:x:1001:xiaolige
xiaolige:x:8888:8888:one number of grouplijun:/lijun:/bin/bash
[root@CentOS7ceshi ~]$ls -a /lijun
. .. .bash_logout .bash_profile .bashrc #指定的家目录已生成
```

范例2:-N 不创建私用组做主组,使用users组做主组

```bash
[root@CentOS7ceshi ~]$useradd -N amy
[root@CentOS7ceshi ~]$id amy
uid=8889(amy) gid=100(users) groups=100(users)
```

范例3:-r 创建系统用户 并-m创建系统用户的家目录

```bash
[root@CentOS7ceshi ~]$useradd -r -m -u 888 program
[root@CentOS7ceshi ~]$id program
uid=888(program) gid=888(program) groups=888(program)
[root@CentOS7ceshi ~]$ls -a /home/program/
. .. .bash_logout .bash_profile .bashrc
```

### 4./etc/default/useradd文件及useradd -D显示及修改选项

```bash
[root@CentOS7ceshi ~]$cat /etc/default/useradd
# useradd defaults file
GROUP=100 #useradd -N选项创建账户指定为uses组,gid为100
HOME=/home
INACTIVE=-1 #对应passwd第7段,密码过期宽限期。-1为密码永不过期
EXPIRE= #对应passwd的第8段,账户失效期,空白表示账号永不失效
SHELL=/bin/bash
SKEL=/etc/skel #一个默认定义用户家目录设置的神奇选项,下面介绍
CREATE_MAIL_SPOOL=yes #自动创建账户邮箱
#上述/etc/default/useradd下的默认配置还可以用useradd -D调出
[root@CentOS7ceshi ~]$useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#可以使用useradd -D选项显示修改默认组-g,默认shell类型-s,默认家目录-b。见下面
[root@CentOS7ceshi ~]$useradd -D -g 8888 -b /data -s /sbin/nologin
[root@CentOS7ceshi ~]$useradd -D
GROUP=8888
HOME=/data
INACTIVE=-1
EXPIRE=
SHELL=/sbin/nologin
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
```

### 5./etc/skel/*与家目录的关系

```
[root@CentOS7ceshi ~]$useradd amy
[root@CentOS7ceshi ~]$ls -a /home/amy
. .. .bash_logout .bash_profile .bashrc
[root@CentOS7ceshi ~]$ls -a /etc/skel
. .. .bash_logout .bash_profile .bashrc
[root@CentOS7ceshi ~]$touch /etc/skel/f4
[root@CentOS7ceshi ~]$useradd andi
[root@CentOS7ceshi ~]$ls -a /home/andi
. .. .bash_logout .bash_profile .bashrc f4
```

### 6./etc/login.defs

### 6.newusers批量创建用户

格式:newusers passwd格式的文件

```bash
[root@CentOS7ceshi ~]$vim addusers
[root@CentOS7ceshi ~]$cat addusers
amy:x:1001:1001:yanxi:/home/amy:/bin/bash
andi:x:1002:1002:yanxi:/home/andi:/bin/bash
rose:x:1003:1003:yanxi:/home/rose:/bin/bash
[root@CentOS7ceshi data]$newusers addusers
[root@CentOS7ceshi ~]$getent passwd |grep yanxi
amy:x:1001:1001:yanxi:/home/amy:/bin/bash
andi:x:1002:1002:yanxi:/home/andi:/bin/bash
rose:x:1003:1003:yanxi:/home/rose:/bin/bash
```

### 7.chpasswd批量修改用户口令

格式:echo username:passwd | chpasswd
用户名:密码格式的文件 |chpasswd
由此可知chpasswd可以接受标准输入

````bash
#方法1:echo用户名:密码格斯通过管道修改
[root@CentOS7ceshi ~]$echo andi:123456 |chpasswd
[root@CentOS7ceshi ~]$su - andi
[andi@CentOS7ceshi ~]$
#方法2 用户名:密码格式的文件 |chpasswd
[root@CentOS7ceshi ~]$cat passwd.txt
amy:234567
andi:234567
rose:234567
[root@CentOS7ceshi ~]$cat passwd.txt |chpasswd
#方法3:chpasswd直接标准输入修改
[root@CentOS7ceshi ~]$chpasswd
amy:lijun
[root@CentOS7ceshi ~]$su - amy
[amy@CentOS7ceshi ~]$
````

### 8.usermod修改用户

格式:usermod [OPTION] login

常见选项:

-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: 设定非活动期限,即宽限期

范例1:修改用户名字,并修改uid

```bash
[root@CentOS7ceshi ~]$useradd -u 6666 jack
[root@CentOS7ceshi ~]$id jack
uid=6666(jack) gid=6666(jack) groups=6666(jack)
[root@CentOS7ceshi ~]$usermod -l rose -u 7777 jack#修改了原用户jack的名字和id
[root@CentOS7ceshi ~]$id jack
id: jack: no such user#jack的账户被改成了rose
[root@CentOS7ceshi ~]$id rose
uid=7777(rose) gid=6666(jack) groups=6666(jack) #但是jack的gid和group还在
[root@CentOS7ceshi ~]$getent group |grep rose
[root@CentOS7ceshi ~]$getent group |grep jack
jack:x:6666:#rose只是用户,组还是 jack
[root@CentOS7ceshi ~]$groupadd -g 7777 rose
[root@CentOS7ceshi ~]$usermod -g 7777 rose
[root@CentOS7ceshi ~]$id rose
uid=7777(rose) gid=7777(rose) groups=7777(rose)
[root@CentOS7ceshi ~]$getent group |grep jack
jack:x:6666:
[root@CentOS7ceshi ~]$getent group |grep rose
rose:x:7777:
#给rose建了一个组,把rose账户加进rose组发现jack组还在,虽然jack账户没了。所以一般不要改用户名,会导致用户改了,但是组改不了,新用户还是属于老用户的组
```

范例2:-aG给用户增加附加组,注意典型错误

```bash
[root@CentOS7ceshi ~]$useradd jack
[root@CentOS7ceshi ~]$id jack
uid=1001(jack) gid=8889(jack) groups=8889(jack)
[root@CentOS7ceshi ~]$groupadd titanic
#要把用户jack加入到附加组titanic组里面
[root@CentOS7ceshi ~]$usermod -Ga titanic jack
usermod: group 'a' does not exist
[root@CentOS7ceshi ~]$usermod -G -a titanic jack
usermod: group '-a' does not exist
#上面两种方法都失败,注意-a不能放后面,会被识别成a组
[root@CentOS7ceshi ~]$usermod -a -G titanic jack
[root@CentOS7ceshi ~]$usermod -aG titanic jack
[root@CentOS7ceshi ~]$id jack
uid=1001(jack) gid=8889(jack) groups=8889(jack),8890(titanic)
#给jack添加附属组成功
```

范例3:创建新家目录并移动

```bash
[root@CentOS7ceshi ~]$ll /home/jack/*
-rw-r--r--. 1 jack jack 0 Mar 26 08:02 /home/jack/f4
[root@CentOS7ceshi ~]$usermod -md /jack jack #把/home/jack及里面的文件搬移到了/jack中
[root@CentOS7ceshi ~]$ll /jack
total 0
-rw-r--r--. 1 jack jack 0 Mar 26 08:02 f4
[root@CentOS7ceshi ~]$ll /home/jack
ls: cannot access /home/jack: No such file or directory #/home下已不存在jack的家目录了
```

### 9.userdel删除用户

格式:userdel [OPTION]... Login

常见选项:

-f, --force 强制
-r, --remove 删除用户家目录和邮箱

### su切换用户身份

su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完
全切换
su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

==su [-] UserName -c 'COMMAND'== 切换身份执行命令(可以不加引号)

```bash
[root@CentOS7ceshi data]$su - kobe -c whoami
kobe
```

### 10.passwd 修改用户密码

格式:passwd [OPTIONS] UserName
常见选项:

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

### 11.chage 可以修改用户密码策略

格式:chage [OPTION]... LOGIN
常见选项:

-d LAST_DAY
-m --mindays MIN_DAYS
-M --maxdays MAX_DAYS
-W --warndays WARN_DAYS
-I --inactive INACTIVE 密码过期后的宽限期
-E --expiredate EXPIRE_DATE 用户的有效期
-l 显示密码策略

```bash
[root@CentOS7ceshi data]$chage -l ceshi
Last password change : Mar 26, 2020 #第3段
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0 #第4段
Maximum number of days between password change : 99999 #第5段
Number of days of warning before password expires : 7 #第7段
```

### 12.chfn描述账号信息

```bash
[root@centos7 ~]#chfn wang
Changing finger information for wang.
Name [wang]: wangsicong
Office []: wanda
Office Phone []: 10000
Home Phone []: 11111
```

### 13.finger查看个人信息

```bash
[root@centos7 ~]#finger wang
Login: wang      Name: wangsicong
Directory: /home/wang        Shell: /bin/bash
Office: wanda, x1-0000 Home Phone: x1-1111
Never logged in.
No mail.
No Plan.
```

### 14.chsh修改账户shell类型

```bash
[root@centos8 ~]#chsh -s /sbin/nologin wang
Changing shell for wang.
chsh: Warning: "/sbin/nologin" is not listed in /etc/shells.
Shell changed.
```

### 15.groupadd创建组

格式:groupadd [OPTION]... group_name
常见选项:
-g GID 指明GID号;[GID_MIN, GID_MAX]
-r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后: ID<1000

````bash
[root@CentOS7ceshi data]$groupadd -g 2000 sports
[root@CentOS7ceshi data]$getent group sports
sports:x:2000:
````

### 16.groupmod修改组

格式:groupmod [OPTION]... group
常见选项:
-n group_name: 新名字
-g GID: 新的GID

```bash
[root@CentOS7ceshi data]$groupmod -n nba -g 1800 sports
[root@CentOS7ceshi data]$getent group nba
nba:x:1800:
```

### 17.groupdel删除组

格式:groupdel [options] GROUP
常见选项:
-f, --force 强制删除,即使是用户的主组也强制删除组

### 18.gpasswd修改组密码及管理附加组成员

格式:gpasswd [OPTION] GROUP
常见选项:
-a user 将user添加至指定附加组中
-d user 从指定附加组中移除用户user
-A user1,user2,... 设置有管理权限的用户列表,即设置组管理员

```bash
[root@CentOS7ceshi data]$gpasswd sports #修改组账户密码
Changing the password for group sports
New Password:
Re-enter new password:
[root@CentOS7ceshi ~]$getent gshadow sports
sports:$6$5Gt4l/Ul172/5gyp$9gP1eGwpSOFTmGs.9UFvp3uqWkLI/MAOXxqR0QRb2Ye5TZ/HyZ3NsSELYsBHUcRiDxDgxfKWhuRB1LPNoc2mB1::kobe
[root@CentOS7ceshi data]$id kobe
uid=1005(kobe) gid=1005(kobe) groups=1005(kobe)
[root@CentOS7ceshi data]$gpasswd -a kobe sports #将用户添加至附加组中
Adding user kobe to group sports
[root@CentOS7ceshi data]$id kobe
uid=1005(kobe) gid=1005(kobe) groups=1005(kobe),1800(sports)
[root@CentOS7ceshi data]$gpasswd -d kobe sports
Removing user kobe from group sports
[root@CentOS7ceshi data]$id kobe
uid=1005(kobe) gid=1005(kobe) groups=1005(kobe)
```

### 19newgrp临时切换主组

格式:newgrp [-] [group]
注意:如果使用 - 选项,可以初始化用户环境。

```bash
[kobe@CentOS7ceshi ~]$id kobe
[kobe@CentOS7ceshi ~]$touch f1
[kobe@CentOS7ceshi ~]$ll f1
-rw-rw-r--. 1 kobe kobe 0 Mar 27 20:35 f1
[kobe@CentOS7ceshi ~]$newgrp - sports
[kobe@CentOS7ceshi ~]$touch f2
[kobe@CentOS7ceshi ~]$ll f2
-rw-r--r--. 1 kobe sports 0 Mar 27 20:35 f2
```

### 20.groupmems更改和查看附加组成员

格式:groupmems [options] [action]
常见选项:
-g, --group groupname 更改为指定组 (只有root)
actions:
-a, --add username 指定用户加入组
-d, --delete username 从组中删除用户
-p, --purge 从组中清除所有成员
-l, --list 显示组成员列表

```bash
[root@CentOS7ceshi ~]$groupmems -l -g sports
kobe
[root@CentOS7ceshi ~]$groupmems -a jordan -g sports
[root@CentOS7ceshi ~]$groupmems -l -g sports
kobe jordan
[root@CentOS7ceshi ~]$groupmems -d kobe -g sports
[root@CentOS7ceshi ~]$groupmems -l -g sports
jordan
[root@CentOS7ceshi ~]$groupmems -p -g sports
[root@CentOS7ceshi ~]$groupmems -l -g sports #清空sports组员
[root@CentOS7ceshi ~]$ #组员被清空
```

### groups 可查看用户属于哪个组

格式:groups 用户名

```bash
[root@CentOS7ceshi ~]$groups jordan
jordan : jordan sports
[root@CentOS7ceshi ~]$groups kobe
kobe : kobe sports
```

## 文件权限管理

文件属主、属组、权限、特殊权限等是文件系统的功能,不是操作系统的功能。

### 1.文件所有者和属组属性操作

#### chown修改文件属主属组

chown 命令可以修改文件的属主,也可以修改文件属组
格式:
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
用法说明:
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改属组,冒号也可用 . 替换
--reference=RFILE #参考指定的的属性,来修改
-R #递归,此选项慎用,非常危险!

```bash
[kobe@CentOS7ceshi data]$ll champion
-rw-rw-r--. 1 kobe kobe 0 Mar 27 20:56 champion
[root@CentOS7ceshi data]$chown jordan:sports champion
[root@CentOS7ceshi data]$ll champion
-rw-rw-r--. 1 jordan sports 0 Mar 27 20:56 champion
[root@CentOS7ceshi data]$ll f1
-rw-r--r--. 1 root root 0 Mar 27 20:47 f1
[root@CentOS7ceshi data]$chown --reference=f1 champion
[root@CentOS7ceshi data]$ll champion
-rw-rw-r--. 1 root root 0 Mar 27 20:56 champion
```

#### chgrp只能修改文件属主

格式:chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
常用选项:-R 递归

### 2.文件权限

#### 大X权限对目录的用法

文件和目录都分别有三种权限,r读,w写,x执行。其中目录还有一个X权限,只对目录有效,一般配合-R递归使用。对一个目录进行-RX操作,会给这个目录下的子目录加执行权限,有执行权限的文件加执行权限,没有执行权限的不加。

```bash
[root@CentOS7ceshi data]$ll
total 0
drwxr--r--. 2 root root 6 Mar 27 21:29 dir
dr--r--r--. 2 root root 6 Mar 27 21:30 dir2
-r-xr--r--. 1 root root 0 Mar 27 21:18 f1
-rw-r--r--. 1 root root 0 Mar 27 21:19 f2
[root@CentOS7ceshi data]$chmod -R a+X /data
[root@CentOS7ceshi data]$ll
total 0
drwxr-xr-x. 2 root root 6 Mar 27 21:29 dir
dr-xr-xr-x. 2 root root 6 Mar 27 21:30 dir2
-r-xr-xr-x. 1 root root 0 Mar 27 21:18 f1
-rw-r--r--. 1 root root 0 Mar 27 21:19 f2
```

#### 临时使用umask的方法

==( umask 666;touch f9 )== 注意小括号前面有空格,中间是分号

```bash
[root@CentOS7ceshi data]$umask
0022
[root@CentOS7ceshi data]$touch f7
[root@CentOS7ceshi data]$ll f7
-rw-r--r--. 1 root root 0 Mar 28 13:44 f7
[root@CentOS7ceshi data]$( umask 666;touch f9 ) #
[root@CentOS7ceshi data]$ll f9
----------. 1 root root 0 Mar 28 13:44 f9
```

### 3.文件系统的特殊权限

#### suid

二进制的可执行文件上SUID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID只对二进制可执行程序有效
SUID设置在目录上无意义

用法:
chmod u+s FILE...
chmod 6xxx FILE
chmod u-s FILE...

```bash
#suid只能作用于二进制文件
[ceshi@CentOS7ceshi ~]$cat /etc/shadow
cat: /etc/shadow: Permission denied #普通用户无法访问/etc/shadow文件
[root@CentOS7ceshi data]$ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 Aug 20 2019 /usr/bin/cat
[root@CentOS7ceshi data]$chmod 4755 /usr/bin/cat
[root@CentOS7ceshi data]$ll /usr/bin/cat
-rwsr-xr-x. 1 root root 54080 Aug 20 2019 /usr/bin/cat#给cat添加了suid权限
[ceshi@CentOS7ceshi ~]$cat /etc/shadow
root:$6$6CoMvJu8FJebUeHM$I7GNkeRELFojRtDYaHD/ar5C/914PtageSEX19j5rts/navj0ZKP3Ppfnn.GzUE18uUoY4pZe50soVVgpUtsb1::0:99999:7:::
bin:*:17834:0:99999:7::: #普通用户可以访问/etc/shadow
```

#### sgid

1. 二进制的可执行文件上SGID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属组为原程序文件的属组

2. 目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有
写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录

```bash
[ceshi@CentOS7ceshi ~]$ll /data/test -d
drwxrwsrwx. 2 ceshi ceshi 6 Mar 27 22:20 /data/test #给/data/test添加了sgid的特殊权限
[kobe@CentOS7ceshi data]$touch /data/test/lakers
[kobe@CentOS7ceshi data]$ll /data/test/lakers
-rw-rw-r--. 1 kobe ceshi 0 Mar 27 22:22 /data/test/lakers #kobe创建的文件继承了ceshi属组
[jordan@CentOS7ceshi data]$touch /data/test/bulls
[jordan@CentOS7ceshi data]$ll /data/test/bulls
-rw-rw-r--. 1 jordan ceshi 0 Mar 27 22:23 /data/test/bulls #乔丹创建了文件继承了ceshi属组
```

3. Sticky

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义

用法:
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...

```bash
[root@CentOS7ceshi data]$groupmems -l -g sports
kobe jordan #jordan 和kobe属于同一个组
[root@CentOS7ceshi data]$chmod 1777 /data/test
[root@CentOS7ceshi data]$ll /data/test -d
drwxrwxrwt. 2 root root 6 Mar 27 22:32 /data/test
[root@CentOS7ceshi data]$chgrp sports /data/test
[root@CentOS7ceshi data]$ll -d /data/test/
drwxrwxrwt. 2 root sports 33 Mar 27 22:33 /data/test/
[kobe@CentOS7ceshi data]$ll /data/test/
total 0
-rw-rw-r--. 1 jordan jordan 0 Mar 27 22:40 bulls
-rw-rw-r--. 1 kobe kobe 0 Mar 27 22:40 lakers
[kobe@CentOS7ceshi data]$rm -rf /data/test/bulls
rm: cannot remove ‘/data/test/bulls’: Operation not permitted
```

### 4.文件的特殊属性,对root用户限制的

#### chattr +i FILE 不能删除,改名,更改

```bash
[root@CentOS7ceshi data]$touch f1
[root@CentOS7ceshi data]$chattr +i f1
[root@CentOS7ceshi data]$rm -rf f1
rm: cannot remove ‘f1’: Operation not permitted
[root@CentOS7ceshi data]$mv f1 f1.txt
mv: cannot move ‘f1’ to ‘f1.txt’: Operation not permitted
[root@CentOS7ceshi data]$echo 123 >> f1
-bash: f1: Permission denied
[root@CentOS7ceshi data]$lsattr f1
----i----------- f1
```

#### chattr +a FILE 只能追加内容,不能删除,改名

```bash
[root@CentOS7ceshi data]$touch f2
[root@CentOS7ceshi data]$chattr +a f2
[root@CentOS7ceshi data]$rm -rf f2
rm: cannot remove ‘f2’: Operation not permitted
[root@CentOS7ceshi data]$mv f2 f2.txt
mv: cannot move ‘f2’ to ‘f2.txt’: Operation not permitted
[root@CentOS7ceshi data]$echo 123 >f2
-bash: f2: Operation not permitted
[root@CentOS7ceshi data]$echo 123 > f2
-bash: f2: Operation not permitted
[root@CentOS7ceshi data]$echo 123 >> f2 #不能覆盖,只能追加
[root@CentOS7ceshi data]$cat f2
123
[root@CentOS7ceshi data]$lsattr f2
-----a---------- f2
```

#### lsattr显示特定属性

### acl访问控制列表及mask权限

ACL生效顺序:
所有者,自定义用户,所属组|自定义组,其他人

setfacl 可以设置ACL权限
设置acl:setfacl -m [u|g|o]:设置acl的用户名:权限 文件
删除设置的单个acl :setfacl -x
清除所有ACL权限:setfacl -b file1
复制file1的acl权限给file2:getfacl file1 | setfacl --set-file=- file2

getfacl 可查看设置的ACL权限
格式:getfacl 文件

acl中mask权限设置
格式:setfacl -m mask::权限 file

```bash
[root@CentOS7ceshi data]#ll f1
-rw-r--r--. 1 root root 4 Mar 28 14:53 f1 #权限是644
[root@CentOS7ceshi data]#groupmems -l -g sports
jordan kobe #用户jordan属于sports
[root@CentOS7ceshi data]#setfacl -m u:jordan:4 f1
[root@CentOS7ceshi data]#setfacl -m g:sports:6 f1
[root@CentOS7ceshi data]#ll f1
-rw-rw-r--+ 1 root root 4 Mar 28 14:53 f1 #发现权限由644变成了664
[ceshi@CentOS7ceshi ~]$id ceshi
uid=1000(ceshi) gid=1000(ceshi) groups=1000(ceshi),0(root) #将ceshi用户加入root组中来验证root组权限是6还是4?
[ceshi@CentOS7ceshi data]$echo 456 >>f1
-bash: f1: Permission denied #root组没有w权限,看来设置acl后的组权限不是原来的组权限,而是被设置acl组的权限
[root@CentOS7ceshi data]#getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:jordan:r--
group::r--
group:sports:rw-
mask::rw-
other::r--
#使用getfacl看到的才是设置了acl后的真实权限
[jordan@CentOS7ceshi data]$cat f1
123
[jordan@CentOS7ceshi data]$echo 456 >f1
-bash: f1: Permission denied
#被设置了acl读权限的jordan只能读,不能写,虽然jordan是sports组的成员
[kobe@CentOS7ceshi data]$cat f1
123
[kobe@CentOS7ceshi data]$echo 456 >>f1 #而sports组里面的kobe可以对f1进行读写
[root@CentOS7ceshi data]#setfacl -m m::4 f1 #mask限高杆设置了r权限
[root@CentOS7ceshi data]#getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:jordan:r--
group::r--
group:sports:rw- #effective:r-- 被影响了,只能是r权限了
mask::r--
other::r--
[kobe@CentOS7ceshi data]$echo 789 >>f1
-bash: f1: Permission denied #sports组里面的kobe的w权限被限制了
[kobe@CentOS7ceshi data]$cat f1
123
456
[root@CentOS7ceshi data]#ll f1
-rw-r--r--+ 1 root root 8 Mar 28 15:07 f1 #当设置了限高杆之后属组权限又变成了4
```

### 备份和还原acl

主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不
会保留目录和文件的ACL信息

常用范例:

```bash
#备份ACL
getfacl -R /tmp/dir > acl.txt
#消除ACL权限
setfacl -R -b /tmp/dir
#还原ACL权限
setfacl -R  --set-file=acl.txt /tmp/dir
#还原ACL权限
setfacl --restore acl.txt
#查看ACL权限
getfacl -R /tmp/dir
```

## 脱坑指南

1.一个文件的属主没有只有r权限,但是属组有rw权限,而且属主在属组里,那么这个属主对文件有什么权限?

```bash
[root@CentOS7ceshi data]$ll
total 0
-r--rw-r--. 1 kobe sports 0 Mar 27 21:38 champion
[root@CentOS7ceshi data]$groups kobe
kobe : kobe sports
#kobe对champion只有读权限,但是sports组对championyou读写权限,而kobe属于sports组。
[kobe@CentOS7ceshi data]$echo 123 >champion
-bash: champion: Permission denied
#然而kobe对champion没有写权限
#用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即
#生效,不再向右查看其权限
```

2. 普通用户不能改文件的属主(栽赃陷害),可以改文件的权限吗?

```bash
[jordan@CentOS7ceshi data]$ll AJ
-rw-rw-r--. 1 jordan jordan 0 Mar 27 21:48 AJ
jordan@CentOS7ceshi data]$chmod 777 AJ
[jordan@CentOS7ceshi data]$ll AJ
-rwxrwxrwx. 1 jordan jordan 0 Mar 27 21:48 AJ
[kobe@CentOS7ceshi data]$chmod 666 AJ
chmod: changing permissions of ‘AJ’: Operation not permitted
#普通用户只能改自己文件的权限
```

3. 普通用户不能改文件的属主,但是可以改文件的属组,但是改后的组也得是属主所在的组

```bash

```

4. 牛逼的root用户,可以给操作任何权限的文件。只有特殊权限chattr才能现在root。

```bash
[root@CentOS7ceshi data]$ll f1
----------. 1 root root 0 Mar 28 13:23 f1
[root@CentOS7ceshi data]$echo 123 > f1
[root@CentOS7ceshi data]$cat f1
123
```

## 课后练习

1. 在/testdir/dir里创建的新文件自动属于webs组,组apps的成员如:tomcat能对这些新文件有读写
权限,组dbs的成员如:mysql只能对新文件有读权限,其它用户(不属于webs,apps,dbs)不能
访问这个文件夹

```bash
[root@CentOS7ceshi ~]$mkdir -p /testdir/dir
[root@CentOS7ceshi ~]$groupadd webs
[root@CentOS7ceshi ~]$groupadd apps
[root@CentOS7ceshi ~]$groupadd dbs
[root@CentOS7ceshi ~]$chgrp webs /testdir/dir
[root@CentOS7ceshi ~]$ll /testdir/dir/ -d
drwxr-xr-x. 2 root webs 6 Mar 28 07:04 /testdir/dir/
[root@CentOS7ceshi ~]$chmod 2755 /testdir/dir
[root@CentOS7ceshi ~]$ll /testdir/dir -d
drwxr-sr-x. 2 root webs 6 Mar 28 07:04 /testdir/dir
[root@CentOS7ceshi ~]$touch /testdir/dir/f1
[root@CentOS7ceshi ~]$ll /testdir/dir/f1
-rw-r--r--. 1 root webs 0 Mar 28 07:10 /testdir/dir/f1
#上面,实现了在/testdir/dir里创建的新文件自动属于webs组
[root@CentOS7ceshi ~]$setfacl -m g:apps:6 /testdir/dir/f1
[root@CentOS7ceshi ~]$setfacl -m g:dbs:4 /testdir/dir/f1
[root@CentOS7ceshi ~]$getfacl /testdir//dir/f1
getfacl: Removing leading '/' from absolute path names
# file: testdir//dir/f1
# owner: root
# group: webs
user::rw-
group::r--
group:apps:rw-
group:dbs:r--
mask::rw-
other::r--
[root@CentOS7ceshi ~]$usermod -aG apps tomcat
[root@CentOS7ceshi ~]$usermod -aG dbs mysql
[root@CentOS7ceshi ~]$groups tomcat
tomcat : tomcat apps
[root@CentOS7ceshi ~]$groups mysql
mysql : mysql dbs
[root@CentOS7ceshi ~]$echo 123 >/testdir/dir/f1
[root@CentOS7ceshi ~]$chmod 2770 /testdir/dir/f1
[root@CentOS7ceshi ~]$ll /testdir/dir/f1
-rwxrws---+ 1 root webs 4 Mar 28 07:20 /testdir/dir/f1
[tomcat@CentOS7ceshi ~]$echo 456 >> /testdir/dir/f1
[tomcat@CentOS7ceshi ~]$cat /testdir/dir/f1
123
456 # apps组下的tomcat用户可读可写
[mysql@CentOS7ceshi ~]$echo 789 >> /testdir/dir/f1
-bash: /testdir/dir/f1: Permission denied
[mysql@CentOS7ceshi ~]$cat /testdir/dir/f1
123
456 #dbs组下的mysql只能读不能写
[kobe@CentOS7ceshi ~]$groups kobe
kobe : kobe sports
[kobe@CentOS7ceshi ~]$echo 789 >> /testdir/dir/f1
-bash: /testdir/dir/f1: Permission denied
[kobe@CentOS7ceshi ~]$cat /testdir/dir/f1
cat: /testdir/dir/f1: Permission denied #spors组下的kobe没有读写权限
```

2. 误将 /bin/chmod 文件的执行权限删除,如何恢复?

```bash
[root@CentOS7ceshi ~]$ll /bin/chmod
-rwxr-xr-x. 1 root root 58592 Aug 20 2019 /bin/chmod
[root@CentOS7ceshi ~]$chmod 644 /bin/chmod
[root@CentOS7ceshi ~]$ll /bin/chmod
-rw-r--r--. 1 root root 58592 Aug 20 2019 /bin/chmod
[root@CentOS7ceshi ~]$chmod 755 /bin/chmod
-bash: /usr/bin/chmod: Permission denied #chmod的执行权限已失效
[root@CentOS7ceshi ~]$setfacl -m u:root:7 /bin/chmod
[root@CentOS7ceshi ~]$getfacl /bin/chmod
getfacl: Removing leading '/' from absolute path names
# file: bin/chmod
# owner: root
# group: root
user::rw-
user:root:rwx
group::r--
mask::rwx
other::r--
[root@CentOS7ceshi ~]$chmod 755 /bin/chmod
[root@CentOS7ceshi ~]$ll /bin/chmod
-rwxr-xr-x+ 1 root root 58592 Aug 20 2019 /bin/chmod
```

## 权限管理总结

用户可以对自己的文件改权限,但不能改属主属组

创建文件的要求:用户对文件的上一级目录有w权限

普通用户改文件属主:

不可以

```bash
[jordan@CentOS7ceshi data]$ll bulls
-rw-rw-r--. 1 jordan jordan 0 Mar 28 12:42 bulls
[jordan@CentOS7ceshi data]$id jordan
uid=1006(jordan) gid=1006(jordan) groups=1006(jordan),1800(sports),8896(nba)
[jordan@CentOS7ceshi data]$chgrp sports bulls
[jordan@CentOS7ceshi data]$ll bulls
-rw-rw-r--. 1 jordan sports 0 Mar 28 12:42 bulls
[jordan@CentOS7ceshi data]$chgrp nba bulls
chgrp: changing group of ‘bulls’: Operation not permitted
[jordan@CentOS7ceshi data]$ll bulls
-rw-rw-r--. 1 jordan sports 0 Mar 28 12:42 bulls
```

猜你喜欢

转载自www.cnblogs.com/lijun20/p/12588714.html