# 用户

**用户一般来说是指使用计算机的人，计算机针对使用其的每一个人给了一个特定的名称，用户就可以使用这些名称来登录使用计算机，除了人之外，一些系统服务也需要含有部分特权的用户账户运行；因此出于安全考虑，用户管理应运而生，它加以明确限制各个用户账户的权限，root在计算机中拥有至高特权，所以一般只作管理用，非特权用户可以通过 SU 或 SUDO 程序来临时获得特权**


---

**GNU/Linux 通过用户和用户组实现访问控制----包括对文件访问、设备使用的控制**

**个人可以拥有很多账户，只不是彼此名称不同，比如root名称已经占用就不能再用了，此外，任意用户可能从属某个用户组，此用户可以加入某些已经存在的组来获得该组的特权**

**GNU/Linux 系统中的每一个文件都有属一个用户（属主）和一个用户组（属组）。另外，还有三种类型的访问权限：读（read）、写（write）、运行（execute）。**

---

## 用户账号、用户的分类

liunx识别用户：通过UID （用户的id 号码）

id 语法：

id 用户名

```
[root@exrcise1 opt]# id 				#如不接用户名，则显示当前用户名
uid=0(root) gid=0(root) 组=0(root)
[root@exrcise1 opt]# id sshd			#接用户名，则显示指定用户名
uid=74(sshd) gid=74(sshd) 组=74(sshd)
[root@home ~]# id abdc					#可以识别系统有没有指定
id: abdc: no such user

```



Linux用户三种角色

超级用户：root &nbsp; &nbsp;拥有对系统的最高的管理权限 &nbsp; &nbsp;<font color='red'>ID=0</font>

普通用户：系统用户 &nbsp; &nbsp;UID:<font color='red'>1-999(centos7 版本)</font>&nbsp; &nbsp;<font color='red'>1-499(centos6 版本)</font>\
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;本地用户  &nbsp; &nbsp;<font color='red'>UID:1000+</font>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<font color='red'>500+</font>

UID:即每个用户的身份标示,类似于每个人的身份证号码 .


虚拟用户：伪用户   一般不会用来登录系统的，它主要是用于维持某个服务的正常运行 .如：ftp，apache 

 

---

下图是用户和组的关系：

一对一：一个用户可以存在一个组中； 

多对一：多个用户可以存在一个组中；

一对多：一个用户可以存在多个组中；

多对多：多个用户可以存在多个组中；
![user.png](https://s2.loli.net/2022/01/17/69rMpxJzdswYPUO.png)

名称 | 账号信息 | 说明
---|---|---
用户配置文件 | /etc/passwd | 记录了每个用户的一些基本属性，并且对所有用户可读，每一行记录 对应一个用户，每行记录通过冒号进行分隔
用户组文件 | /etc/group | 用户组的所有信息存放地，并且组名不能重复
用户对应的密码信息 | /etc/shadow | 因为  passwd  文件对所有用户是可读的， 为安全起见把密码从 passwd中分离出来放入这个单独的文件，该文件只有 root 用户拥有 读权限，从而保证密码安全性


# 用户管理

添加用户命令

命令：useradd

useradd  -d  -u “UID”  -g "主组"  -G "附加组"  -s "登陆的 shell”   -c   指定说明信息 用户

参数：

    -d ：用户主目录路径， 可以指定用户家目录 
    -m : 如果没有目录，会自动创建新目录并且移到内容到新目录里面
    -u : 指定用户ID号
    -g ：设置用户初始组的名称或数字ID；该组必须是存在的；如果没有设置该选项，useradd会根据/etc/login.defs文件中的 USERGROUPS_ENAB环境变量进行设置。
    默认 USERGROUPS_ENAB yes 会用 和用户名相同的名字创建群组，GID 等于 UID.
    -G ：用户要加入的附加组列表；使用逗号分隔多个组，不要添加空格；如果不设置，用户仅仅加入初始组。(一 个用户只允许有一个主组，可以有多个附属组)
    -s ：用户默认登录 shell 的路径；启动过程结束后，默认启动的登录 shell 在此处设定；请确保使用的 shell
    已经安装，默认是 Bash。有时候需要禁止某些用户执行登录动作，例如用来执行系统服务的用户。将  shell 设置成 /sbin/nologin就可以禁止用户登录。
    -c : 附加描述信息
    -M : 给创建的用户不创建家目录
    -r : 创建系统账户，默认无家目录

## 添加登录用户

    例子：添加一个名为 lin01 的用户，并使用 bash 作为登录的shell 
    [root@exercise1 ~]# useradd lin01
    [root@exercise1 ~]# tail -1 /etc/passwd
    lin01:x:1000:1000::/home/lin01:/bin/bash
    [root@exercise1 ~]# 

说明：此命令会自动创建 lin01 组，并成为 lin01 用户的默认主组，同时默认的登录 shell 是 bash
用户帐户的全部信息被保存在/etc/passwd文件。这个文件以如下格式保存了每一个系统帐户的所有信息 (字 段以“:”分割)

==**lin01:x:1000:1000::/home/lin01:/bin/bash**==
![tu.png](https://s2.loli.net/2022/01/17/JAytILuDwCBFjMO.png)

lin01 ：用户名 

x ：密码占位符

1001 ：用户的 UID ，它都是用数字来表示的    

1001 ：用户所属组的GID ，它都是用数字来表示的

用户描述信息：对用户的功能或其它来进行一个简要的描述      

/home/lin01 ：用户主目录（shell 提示符中“~”代表的那个）
/bin/bash ：用户登录系统后使用的shell 

---

==解释二：==

/etc/passwd中一行记录对应着一个用户，每行记录又被冒号(:)分隔为7个字段，其格式和具体含义如下：
    
    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
    
    #查看系统中，支持哪些shell
    [root@exercise1 ~]# cat /etc/shells 
    /bin/sh
    /bin/bash
    /sbin/nologin
    /usr/bin/sh
    /usr/bin/bash
    /usr/sbin/nologin



### 指定用户 UID

    [root@exercise1 ~]# useradd -u 1100 oracle
    [root@exercise1 ~]# id oracle
    uid=1100(oracle) gid=1100(oracle) 组=1100(oracle)
    [root@exercise1 ~]# tail -1 /etc/passwd
    oracle:x:1100:1100::/home/oracle:/bin/bash
    [root@exercise1 ~]# ls /home/oracle/ -a
    .  ..  .bash_logout  .bash_profile  .bashrc
    [root@exercise1 ~]# 

### 指定用户主目录 
    [root@exercise1 ~]# useradd -d /opt/lin01 lin01
    [root@exercise1 ~]# tail -1 /etc/passwd
    lin01:x:1101:1101::/opt/lin01:/bin/bash
    [root@exercise1 ~]# 

### 指定用户的主组

    [root@exercise1 ~]# useradd lin02
    [root@exercise1 ~]# id lin02
    uid=1102(lin02) gid=1102(lin02) 组=1102(lin02)
    [root@exercise1 ~]# useradd -g lin02 abc
    [root@exercise1 ~]# id abc
    uid=1103(abc) gid=1102(lin02) 组=1102(lin02)
    [root@exercise1 ~]# 

### 指定用户的附属组

我们也可以把这个附属组称为补充组，用户可以有 0 个或多个附加组的成员

    [root@exercise1 ~]# useradd -G root,lin01,lin02 lin03
    [root@exercise1 ~]# id lin03
    uid=1104(lin03) gid=1104(lin03) 组=1104(lin03),0(root),1101(lin01),1102(lin02)
    [root@exercise1 ~]# 

### 创建用户的另外一个命令(了解)

    [root@exercise1 ~]# adduser lin04
    [root@exercise1 ~]# id lin04
    uid=1105(lin04) gid=1105(lin04) 组=1105(lin04)
    [root@exercise1 ~]# which adduser
    /usr/sbin/adduser
    [root@exercise1 ~]# ll /usr/sbin/adduser
    lrwxrwxrwx. 1 root root 7 1月   9 09:29 /usr/sbin/adduser -> useradd   注： adduser 是useradd的软链接
    [root@exercise1 ~]# 

### 指定用户默认登录 shell 的路径

    [root@exercise1 ~]# useradd -s "/bin/nologin" lin05
    [root@exercise1 ~]# su lin05
    su: failed to execute /bin/nologin: 没有那个文件或目录
    [root@exercise1 ~]# 

## 修改用户信息

语法：usermod   【参数】用户名

常用参数：

    -u             指定要修改用户的UID
    -g             指定要修改用户的主组         #只有一个(只能修改系统已存在的组)
    -G             指定要修改用户的附属组         #可以有多个
    -d             指定要修改用户的家目录
    -s             指定要修改用户的登录 shell
    -c             指定要修改用户的指定说明信息
    -a  		   添加指定成员到附属组中

### 修改 UID

    [root@exercise1 ~]# id oracle
    uid=1100(oracle) gid=1100(oracle) 组=1100(oracle)
    [root@exercise1 ~]# usermod -u 1111 oracle
    [root@exercise1 ~]# id oracle
    uid=1111(oracle) gid=1100(oracle) 组=1100(oracle)
    [root@exercise1 ~]# 

### 修改附加组

​    [root@exercise1 ~]# usermod -G 1102 abc   #修改的组要存在
​    [root@exercise1 ~]# id abc
​    uid=1103(abc) gid=1102(lin02) 组=1102(lin02)
​    [root@exercise1 ~]# 

###   修改 shell

​    [root@exercise1 ~]# usermod -s "/bin/nologin" oracle
​    [root@exercise1 ~]# tail -2 /etc/passwd
​    oracle:x:1111:1100::/home/oracle:/bin/nologin
​    abc:x:1103:1102::/home/abc:/bin/bash
​    [root@exercise1 ~]# 

###   修改用户主目录

​    [root@exercise1 ~]# usermod -m -d /opt/abc abc
​    -m 选项会自动创建新目录并且移到内容到新目录里面

###    添加说明信息

​    [root@exercise1 ~]# usermod -c "hello word" abc
​    [root@exercise1 ~]# tail -2 /etc/passwd
​    oracle:x:1111:1100::/home/oracle:/bin/nologin
​    abc:x:1103:1102:hello word:/opt/abc:/bin/bash
​    [root@exercise1 ~]# 


​    



## 删除用户

语法: userdel 参数 用户名

选项：-r 删除的时候，会同时删除用户的家目录和/var/mail 下的目录 

    [root@exercise1 ~]# userdel  lin03
    
    [root@exercise1 ~]# userdel -r lin03

提问：如果当有一个用户正在使用

能否删除

```
[root@home ~]# userdel -r abc
userdel: user abc is currently used by process 19055
[root@home ~]# userdel -r abc
```







## 查看用户相关命令

    [root@exercise1 ~]# id   #用户和组的信息
    uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023   #直接id命令默认查找当前用户啊，id 用户名 才是指定查看用户和组的信息
    
    [root@exercise1 ~]# whoami   #查看当前有效用户名
    root
    
    [root@exercise1 ~]# who   #显示目前登入系统的用户信息
    root     pts/0        2022-01-17 17:10 (192.168.119.1)
    root     pts/1        2022-01-17 18:32 (192.168.119.1)


​    
    [root@exercise1 ~]# w   #w命令用于显示已经登陆系统的用户列表
    19:09:59 up  1:53,  2 users,  load average: 0.08, 0.03, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    192.168.119.1    17:10    1:39m  0.02s  0.02s -bash
    root     pts/1    192.168.119.1    18:32    7.00s  0.07s  0.00s w


​    
    [root@exercise1 ~]# users   #用于显示当前登录系统的所有用户的用户列表
    root root



   



## 用户的创建流程

提问：为什么创建用户时，普通UID为什么是1000开始？系统用户UID为什么是从201-999？



系统创建用户参考的两个配置文件

/etc/login.defs
/etc/default/useradd



```
[root@exrcise1 opt]# grep -vE "^#|^$" /etc/login.defs
MAIL_DIR	/var/spool/mail
PASS_MAX_DAYS	99999
PASS_MIN_DAYS	0
PASS_MIN_LEN	5
PASS_WARN_AGE	7

#定义普通用户的UID范围
UID_MIN                  1000
UID_MAX                 60000

#定义系统用户的UID范围
SYS_UID_MIN               201
SYS_UID_MAX               999

#定义组的GID范围
GID_MIN                  1000
GID_MAX                 60000

#定义系统组GID范围
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME	yes						#默认创建家目录
UMASK           077
USERGROUPS_ENAB yes 				#创建用户时都会创建主组
ENCRYPT_METHOD SHA512				#密码加密模式

[root@exrcise1 opt]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1				#是否启用账号过期停权，-1表示不启用
EXPIRE=					#账号终止日期，不设置表示不启用
SHELL=/bin/bash
SKEL=/etc/skel			#配置新用户家目录的默认文件存放路径
CREATE_MAIL_SPOOL=yes
```

小结：如果在创建时自行指定了参数，那么优先使用定义的；如果没有定义则使用默认配置文件（/etc/login.defs ；/etc/default/useradd）



### 解决模板文件被删之后显示不正常的问题

```
[root@exercise1 ~]# rm -rf /home/abc/.bash*
[root@exercise1 ~]# su - abc 
-bash-4.2$ exit  #出现这个不完整的 shell 提示符，如何处理？
[root@exercise1 ~]# cp /etc/skel/.bash* /home/abc/   #存放模板的地方，也可以直接cp其他家目录 cp -r /home/oracle /home/abc
[root@exercise1 ~]# chown abc:abc /home/abc/.bash*
[root@exercise1 ~]# su - abc                    
[root@abc ~]$
```





 



# 用户组管理

<font color='red'>/etc/group</font> 用户组信息配置文件

[root@base home]# vi /etc/group

root : x :  0  :

**以“：”为分隔符，分为4列：\
第1列为用户组\
第2列为密码位\
第3列为GID \
第4列为附属组列表**


## 添加用户组

语法：groupadd   【参数】用户组名

常用参数：

-g 指定新组的GID

    [root@exercise1 ~]# groupadd -g 1400 game
    [root@exercise1 ~]# tail -1 /etc/group
    game:x:1400:
    [root@exercise1 ~]# 


## 修改用户组信息

语法：groupmod   【参数】用户组名

常用参数：

    -g  修改既有的GID
    -n  修改既有的组名
    -d  从组中删除某一个成员


## 用户组切换

    语法：newgrp 用户组名
    
    注：想要切换的用户组必须有支持的用户组
    
    [root@exercise1 ~]# newgrp oracle
    [root@exercise1 ~]# id
    uid=0(root) gid=1100(oracle) 组=1100(oracle),0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    [root@exercise1 ~]# 

## 删除用户组

    语法: groupdel  用户组名
    
    注：必须确认/etc/passwd内的账号没有任何人使用该用户组作为主用户组
    
    [root@exercise1 ~]# groupdel oracle
    groupdel：不能移除用户“oracle”的主组
    [root@exercise1 ~]# groupdel game
    [root@exercise1 ~]# 

## 用户组管理员功能

注：只有root能将用户组的主控权交由后面的用户管理

语法：gpasswd   【参数】用户组名
    
<font color='red'>对于root而言</font>，常用参数：

    -A  用户名    将该用户组的主控权交由后面的用户管理
    -M  用户名   将该用户加入这个用户组里
    -r  将用户组的密码删除

例子：

    [root@exercise1 ~]# groupdel game
    [root@exercise1 ~]# useradd lin05
    [root@exercise1 ~]# groupadd game
    [root@exercise1 ~]# gpasswd -A lin05 game
    [root@exercise1 ~]# gpasswd -M abc game
    [root@exercise1 ~]# tail -2 /etc/group
    lin05:x:1112:
    game:x:1113:abc
    [root@exercise1 ~]# 

<font color='red'>对于用户组管理员而言</font>，常用参数：

    -a  用户名    将该用户加入到用户组当中
    -d  用户名    将该用户删除出用户组

例子：
    
    [root@exercise1 ~]# gpasswd -a lin05 game
    正在将用户“lin05”加入到“game”组中
    [root@exercise1 ~]# gpasswd -d lin05 game
    正在将用户“lin05”从“game”组中删除
    [root@exercise1 ~]# su - lin05
    [lin05@exercise1 ~]$ gpasswd -a lin05 game
    正在将用户“lin05”加入到“game”组中
    [lin05@exercise1 ~]$ gpasswd -d lin05 game
    正在将用户“lin05”从“game”组中删除
    [lin05@exercise1 ~]$ 


  **如果你记不住命令， 那么直接用root权限修改 vi /etc/passwd 也是一样的**



# 密码管理

![pass.png](https://s2.loli.net/2022/01/17/ELYC7IRw3sV2nFQ.png)

    [root@exercise1 ~]# head -3 /etc/shadow
    root:$6$DL36xqQ9Z4lIC96A$TySYbPQmrysstnePos8..QeKSZsAQ.xctrglJVvJDVmL4OmbhtjezPppJWW6c0PijQWeQT5dn9rVaz2rFB9tg.::0:99999:7:::
    bin:*:17110:0:99999:7:::
    daemon:*:17110:0:99999:7:::
    [root@exercise1 ~]# 


**格式如下**

    名称 | 说明
    name | 登录名称，这个必须是系统中的有效账户名
    password | 我们发现所谓的加密算法，其实就是用明文密码和一个叫salt的东西通过函数crypt()完成加密。而所谓的密码域密文也是由三部分组成的，即：$id$salt$encrypted。[注]:tid为1时，采用md5进行加密；id为5时，采用SHA256进行加密；id为6时，采用SHA512进行加密。
    lastchange | 最近一次更改密码的日期，以距离 1970/1/1 的天数表示
    min-age | 不能更改密码的最少天数，最近更改过后几天才可以更改；如果为 0 表示“最短期限要求”
    maxage | 密码过期时间，必须更改密码前的最多天数
    warning | 密码即将到期的警告期，以天数表示，0 表示“不提供警告”
    inactive | 宽限天数，密码到期后
    expire | 账号过期时间，以距离 1970/1/1 的天数计算 (千年虫)
    blank | 预留字段





## 给用户添加密码

注：在默认的情况下，新建账号登陆是暂时封锁的，可以看下/etc/shadow文件的第二个字段

    #交互式
    [root@exercise1 ~]# passwd oracle   #交互(这种方式只能root使用)
    更改用户 oracle 的密码 。
    新的 密码：
    无效的密码： 密码少于 8 个字符
    重新输入新的 密码：
    passwd：所有的身份验证令牌已经成功更新。   #root设置密码可以忽略字典
    
    1.超级管理员
    1.1 随意修改任何人的密码
    1.2 密码强度可以随意
    
    2.普通用户执行
    2.1 仅修改自已的密码，不可以修改其他人；
    2.2 密码强度必须要高


​    
​    #非交互式
​    [root@exercise1 ~]# echo 123456 | passwd --stdin abc   #不交互
​    更改用户 abc 的密码 。
​    passwd：所有的身份验证令牌已经成功更新。
​    [root@exercise1 ~]# 
​    #(--stdin 可以通过来自前一个管 道的数据，作为密码输入)



​    
## 创建随机密码

```
[root@exrcise1 opt]# mkpasswd
-bash: mkpasswd: 未找到命令
[root@exrcise1 opt]# yum provides mkpasswd
已加载插件：fastestmirror
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
expect-5.45-14.el7_1.x86_64 : A program-script interaction and testing utility
源    ：local
匹配来源：
文件名    ：/usr/bin/mkpasswd

[root@exrcise1 opt]# yum install -y expect
[root@exrcise1 opt]# man mkpasswd
[root@exrcise1 opt]# mkpasswd -l 10 -d 3 -c 3 -C 3 -s 1
3tjVWt3_V7
```







## 修改密码

命令：chage

参数：

<font color='red'>-m ：密码可更改的最小天数。为 0 时代表任何时候都可以更改密码</font>

-M ：密码保持有效的最大天数

-W ：用户密码到期前，提前收到警告信息的天数  

-E ：帐号到期的日期。过了这天，此帐号将不可用

<font color='red'>-d ：上一次更改的日期，为 0 表示强制在下次登录时更新密码</font>

-I   :  账号到期后，可以延期的天数

-l：例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。


    例子1：修改用户 abc 密码信息：让这个用户 abc 首次登录系统时必须更改其密码
    
    [root@exercise1 ~]# chage -m 30 abc   #将两次改变密码之间相距的最小天数设为30天，从最近修改密码的日期开始的5天内，用户不能再次修改密码
    [root@exercise1 ~]# chage -M 30 abc   #每隔30天   更新密码
    [root@exercise1 ~]# chage -W 7 abc    #还有7天密码到期
    [root@exercise1 ~]# chage -E '2023-01-01' abc  #账号在2023年1月1号到期
    [root@exercise1 ~]# chage -d 0 abc
    [root@exercise1 ~]# ssh abc@192.168.119.142
    The authenticity of host '192.168.119.142 (192.168.119.142)' can't be established.
    ECDSA key fingerprint is SHA256:8aWF+QxUsRyxsCUKFPSJLUg+iSZuYpjE8/M4Nl6it38.
    ECDSA key fingerprint is MD5:f2:a9:40:4d:28:ac:bb:38:46:dd:2f:98:a0:c3:6a:7e.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.119.142' (ECDSA) to the list of known hosts.
    abc@192.168.119.142's password: 
    You are required to change your password immediately (root enforced)
    WARNING: Your password has expired.
    You must change your password now and login again!   #提示必须改密码
    更改用户 abc 的密码 。
    为 abc 更改 STRESS 密码。
    （当前）UNIX 密码：
    新的 密码：
    无效的密码： 这个密码和原来的相同
    新的 密码：
    无效的密码： 密码与原来的太相似
    新的 密码：
    重新输入新的 密码：
    抱歉，密码不匹配。
    passwd: 已经超出服务重试的最多次数
    Connection to 192.168.119.142 closed.
    
    [root@exercise1 ~]# chage -I 3 abc   #账号到期后，还可以延期3天


​    
​    
​    例子2：帐户密码策略信息
​    [root@exercise1 ~]# chage -l abc
​    最近一次密码修改时间					：密码必须更改
​    密码过期时间					：密码必须更改
​    密码失效时间					：密码必须更改
​    帐户过期时间						：1月 01, 2023
​    两次改变密码之间相距的最小天数		：30
​    两次改变密码之间相距的最大天数		：30
​    在密码过期之前警告的天数	：7

==密码过期==：设置的密码经过一段的时间后，系统会认为该密码不安全，于是将密码设置为过期状态，用户登录的时候，系统会提示用户进行密码修改

==密码失效==：经过一段时间，如果用户没有进行密码修改，则系统会将该密码设置为失效状态（此时用户不可通过该密码进行登录）





# 用户如何提权

往往公司的服务器对外都是禁止root用户直接登灵，所以我们通常使用的都是普通用户，那么问题来了？当我们使用普通用户执行/sbin目录下的命令时，会发现没有权限运行，这种情况下我们无法正常的管理服务器，那如何才能不使用root用户直接登录系统，同时又保证普通用户能完成日常工作？

我们可以使用如下两种方式su、sudo

1.su切换用户，使用普通用户登录，然后使用su命令切换到root。优点简单；缺点：需要知道root密码

2.sudo提权，当需要使用root权限时进行提权，而无需切换至root用户，优点：安全、方便缺点：复杂





## 用户身份切换

命令：su

语法：su 用户名

```
[root@exercise1 ~]# su abc  
[root@exercise1 ~]# su - abc	
```

在使用su切换前，我们需要了解一些预备知识，比如shell分类、环境变量配置文件有哪些



1.Linux Shell主要分为如下几类

登陆shell，需要输入用户名和密码才能进入Shell，日常接触的最多的一种

非登陆shell，不需要输入用户和密码就能进入Shell，比如运行bash会开启一个新的会话窗口



2.bash shell配置文件介绍文件主要保存用户的工作环境

个人配置文件.：～/.bash_profile ；～/.bashrc。

全局配置文件：/etc/profile ；/etc/profile.d/.sh ；/etc/bashrc 

profile类文件，设定环境变量，登陆前运行的脚本和命令。

bashrc类文件，设定本地变量，定义命令别名

<font color='red'>注意：如果全局配置和个人配置产生冲突，以个人配置为准。</font>



3.登陆系统后，环境变量配置文件的应用顺序是？

登录式shell配置文件执行顺序/etc/profile-＞/etc/profile.d/*.sh-＞～/.bash_profile-＞～/bashrc-＞/etc/bashrc

非登陆shell配置文件执行顺序～/.bashrc-＞/etc/bashrc-＞/etc/profile.d/*.sh

提问：如何验证



```
执行前先备份，不然测试完要删好麻烦
echo "echo /etc/profile" >>/etc/profile
echo "echo /etc/profile.d/1.sh" >>/etc/profile.d/1.sh
echo "echo ~/.bash_profile" >>~/.bash_profile
echo "echo ~/.bashrc" >>~/.bashrc
echo "echo /etc/bashrc" >>/etc/bashrc

[root@exrcise1 ~]# su - root
/etc/profile.d/1.sh
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile

[root@exrcise1 ~]# su root
/etc/profile.d/1.sh
/etc/bashrc
/root/.bashrc
```



4.说了这么多预备知识，那这些和su命令切换用户有什么关系？

su - username，属于登陆式shell，su username，属于非登陆式hell，区别在于加载的环境变量不一样。

普通用户su - 可以直接切换root用户，但需要输入root用户的密码。

超级管理员root用户使用su -  username切换普通用户不需要输入任何密码。

**小结：区别在于，加载的环境变量不一样（有可能会造成程序运行异常）**





5.su 还有一种用法


    [root@exrcise1 ~]# useradd abc -r -M
    [root@exrcise1 ~]# su - abc -c "ifconfig"				#指定让abc执行ifconfig命令
    su: 警告：无法更改到 /home/abc 目录: 没有那个文件或目录
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.245.130  netmask 255.255.255.0  broadcast 192.168.245.255
            inet6 fe80::250:56ff:fe27:3876  prefixlen 64  scopeid 0x20<link>
            ether 00:50:56:27:38:76  txqueuelen 1000  (Ethernet)
            RX packets 18885  bytes 6877604 (6.5 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2123  bytes 232746 (227.2 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


​    

**小结：因为有些程序不支持root直接启动; 必须是普通用户; 
		1.普通用户不需要登录系统;
		2.只是用来完成服务的启动;
		3.创建该用户时,一般都创建为一个系统用户; 
		4.最后通过 su - username -c "command" 来完成服务的启动;**









## 提权命令：sudo

sudo可以让你以root的身份来执行命令

    [root@exercise1 ~]# su - abc   #切换身份
    上一次登录：一 1月 17 20:28:22 CST 2022pts/1 上
    [abc@exercise1 ~]$ tail /etc/shadow   #以abc用户读取/etc/shadow
    tail: 无法打开"/etc/shadow" 读取数据: 权限不够
    [abc@exercise1 ~]$ sudo tail /etc/shadow
    
    我们信任您已经从系统管理员那里了解了日常注意事项。
    总结起来无外乎这三点：
    
        #1) 尊重别人的隐私。
        #2) 输入前要先考虑(后果和风险)。
        #3) 权力越大，责任越大。
    
    [sudo] abc 的密码：
    对不起，请重试。
    [sudo] abc 的密码：
    对不起，请重试。
    [sudo] abc 的密码：
    sudo: 3 次错误密码尝试
    [abc@exercise1 ~]$ sudo tail /etc/shadow
    abc 不在 sudoers 文件中。此事将被报告。
    
    [abc@exercise1 ~]$ 登出   #Ctrl+D登出回到root会收到邮件
    您在 /var/spool/mail/root 中有新邮件
    [root@exercise1 ~]# cat /var/spool/mail/root #查看邮件
![sudo.png](https://s2.loli.net/2022/01/17/xTADzrgWB89VHIF.png)

小结：通过sudo执行的命令，都会记录在/var/log/secure文件里



解决方法

用root用户使用visudo去修改/etc/sudoers    ==> vim /etc/sudoers

    用户账号     登陆者的来源主机ip地址      可切换的身份    可执行的命令
    92 root         ALL=				(ALL)       	ALL
    
    99 %wheel  ALL=(ALL)       ALL      #这一行的设置会造成加入wheel组（可自定义用户组）的用户都可以
                                                        使用sudo切换身份进行操作
                                                        
    1.快速配置sudo方式
    [root@exercise1 ~]# usermod abc -G wheel
    
    2.一般正常配置sudo方式
    [root@exercise1 ~]# visudo
    93 abc          ALL=(ALL)       ALL      #添加普通用户权限
    abc     192.168.245.0=(ALL)   ALL        #设置某一网段能使用sudo                                           
    abc          ALL=(ALL)        /usr/sbin/useradd     #允许使用sudo执行指定命令
    abc          ALL=(ALL)        NOPASSWD:/usr/sbin/useradd	#NOPASSWD不需要使用密码
    abc          ALL=(root)       ALL			#只可以切换成root用户
    
    修改后语法检测：
    [root@exercise1 ~]# visudo -c
    
    测试：
    [root@exercise1 ~]# mkdir /test
    
    3.普通用户正常情况下是无法删除test目录的
    [abc@exercise1 ~]$ rm -rf /test
    
    4.使用sudo提权，需要输入普通用户的密码
     sudo rm -rf /test


​    
​    5.查看自己有哪些sudo权限
​    [abc@exercise1 ~]$ sudo -l


提问：提升的权限太大，能否有办法限制仅开启某个命令的使用权限？其他命令不允许？

方法1：使用sudo中自带的别名操作，将多个用户定义成一个组

```
# 1.使用sudo定义分组,这个系统group没什么关系
User_Alias OPS = abc,xiaohuo


# 2.定义可执行的命令组,便于后续调用
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount


# 3.使用sudo开始分配权限
OPS  ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE

```

方法2：使用groudadd添加组，然后给组分配sudo的权限，如果有新用户加入，直接将用户添加到该组

```
#1.添加真实的系统组
[root@exercise1 ~]# groupadd OPS

#2.使用sudo开始分配权限
[root@exercise1 ~]# visudo
%OPS  ALL=(ALL)       ALL		#添加组，分配sudo权限

#3.添加用户加入OPS组
[root@exercise1 ~]# usermod ming -G OPS
```

