Linux用户组和管理
# Linux用户组和管理
## 用户分类
Linux 中用户角色分成三类: 超级用户、系统用户和普通用户。所有 Linux 用户都分配了唯一的用户 ID(uid),uid 是一个整数。普通用户以 1000 或更大的数字开始
1、超级用户 (root 用户): 每个Linux 系统都必须有,并且只有一个。它拥有最高的权限,可以删除、终止任何程序。另外,通常为减少风险要避免普通用户得到 root 用户权限。UID (UserID)值为0
2、系统用户是与系统运行和系统提供的服务密切相关的用户,通常在安装相关的软件包时自动创建并保持默认状态。系统用户不能登录计算机,UID 值 1--999.
3、普通用户是在系统安装后由超级用户创建的,通常完成指定权限的操作,而且也只能操作自己所拥有权限的文件和目录,UID 值 1000--65535.
## 用户管理文件
### 用户账户文件:/etc/passwd
/etc/passwd 文件是用户管理工作涉及的最重要的一个文件。Linux 系统中的每个用户都在/etc/passwd 文件中有一个对应的记录行,它记录了这个用户的一些基本属性。这个文件对所有用户都是可读的。

从上面的例子我们可以看到,/etc/passwd 中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
> 用户名:口令:用户标识号:组标识号:注释性描述:主日录:登录 Shell
1.用户名:在系统中是唯一的,可由字母、数字和符号组成
2.口令:此字段用“x”代替,而将口令保存在/etc/shadow 文件中
3.用户标识号 (UID): 系统内部用它来标识用户且唯一。
超级用户:UID-0,GID-0;
普通用户:UID>1000;
系统用户:0<1000。
4.组标示号 (GID):系统内部用它来标识组属性。
5.用户相关信息:该用户的描述,比如全名
6.用户主目录:用户登录系统后所进入的目录。
7.用户登录环境:用户第一次登录的 Shell 环境
## 用户影子文件:/etc/shadow
用户影子文件/etc/shadow 中的记录行与/etc/passwd 中的一一对应,它由 pwconv 命令根据/etc/passwd 中的数据自动产生它的文件格式与/etc/passwd 类似,由若干个字段组成字段之间用":"隔开。这些字段分别是
> 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
1.用户名:用户登录到系统时使用的名字,而且是惟一的。
2.加密口令:存放MD5 加密过的口令。 (若为空,表示该用户不需口令即可登录;若为!!,表示该用户从来没有设置过密码,不能登录系统;为*,表示该帐号被禁用;若为!!MD5 密码,则表示用户密码被 passwd -l命令锁住;若为!MD5 密码,则表示用户密码被 usermod -L命令锁住。)
3.标识从1970年1月1日到用户最近一次修改口令所经过的天数。
4.口令保持有效的最小天数,即口令在多少天内不能被用户修改
5.口令在多少天后需要被修改。
6.口令到期前多少天内给用户发出警告。
7.口令过期多少天后口令失效。
8.帐号失效日。
9.保留域。
## 用户账户管理
### 添加用户
1.添加用户
添加新用户使用 useradd 完成,删除现有用户使用 userdel 完成。下列命令是添加一个新用户student 的账户:
```shell
$ sudo useradd -m -c "A teacher from cs department" -s /bin/bash yangshu
```
其中的选项和参数描述如下
`-m` 创建用户的主目录
`-c`当前用户的描述,A teacher from cs department。
`-s` 指定 Shell,设置 shell 为/bin/bash。
默认情况下, 该用户的主目录设置为 /home/student,这个文件夹下会从/etc/skel 拷贝一些文件,另外还会在/etc/passwd 文件中添加一条记录如下:
```shell
yangshu:x:1000:1000: A teacher from cs department:/home/yangshu:/bin/bash
```
输入不带参数的命令 id 查看当前用户信息。或者在 id 命今后添加参数 yangshu.
```shell
id yangshu
```
建好用户后可以用 passwd yangshu 修改新建用户的密码
### 修改用户密码
```shell
sudo passwd [option] username
```
-S: 查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。
-l: 暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加"!",使密码
失效。
-u: 解锁用户,和 -1 选项相对应。
-stdin: 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
-n 天数: 设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4个字段。
-x 天数: 设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段。
-w 天数:设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段。
-i 日期:设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。
下列命令用于设置账户的过期时间,选项为 -e 参数为2021-5-1,意味着 student 用户的口令2021年5月1日过期。
```shell
# usermod -e 2021-5-1 yangshu
```
### 删除用户
删除用户命令
```shell
userdel username
```
这个命令会保存用户文件夹,如果不需要保留用户文件夹可以使用下面的命令
```shell
userdel -r yangshu
```
## 组账户管理
### 组账户管理文件
组账户管理 文件包括:
#### 组账户文件:/etc/group
组影子文件:/etc/gshadow
用户组的所有信息都存放在/etc/group文件中,字段信息有
> 组名:口令:组标识号:组内用户列表
"组名"是用户组的名称,由字母或数字构成。与/etc/passwd 中的登录名一样,组名不应重复。
"口令"字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
"组标识号"与用户标识号类似,也是一个整数,被系统内部用来标识组
"组内用户列表"是属于这个组的所有用户的列表,不同用户之间用逗号(.)分隔。这个用户组可能是用户的主组,也可能是次要组。
#### 组影子文件:/etc/gshadow
gshadow文件组成如下:
> 组名:组口令:组管理员:组内用户列表
### 添加用户组账户
```shell
sudo groupadd students
```
### 删除用户组账户
```shell
sudo groupdel students
```
删除指定组,只有超级用户才能使用此命令。需要注意的是被删除的组账号必须存在,当有用户使用组账号作为主要组时不能和三处,用用户同名的组账号在使用userdel命令删除用户时会被同时删除
### 更改用户所属组
在进行下面操作时,我们还是先要建立好一个 student 用户账户和一个students 用户组账户。现在我们要更改用户 student 的主要组,使用带有-g 选项和组名称的 usermod
命令。下列命令是将 student 的主组设置为了students。
```
usermod -g students student
```
要将用户加入到次要组中,使用带有 -G 选项和组名称的 usermod 命令。下列命令是在系统添加一个用户 yangshu,然后将 yangshu 添加到 teachers 的次要组中
```
sudo usermod -a -G teachers yangshu
```
上述命令请确保加上选项-a,这样可以保证用户追加到别的次要组里,而不是移动到别的次要组。将用户从次要组中移除也可使用带有-G 选项和组名称的 usermod 命令。
```shell
usermod -G yangshu yangshu
```
使用 groups 命令查看 yangshu 所属用户组
```shell
groups yangshu
```
### 在组中添加用户
将 wangjing 添加到 teachers 组中,命令如下:
```shell
sudo gpasswd -a wangjing teachers
```
使用-A 选项向 teachers 组中添加管理员
```shell
sudo gpasswd -A yangshu teachers
```
查看组影子文件
```shell
sudo tail -n1 /etc/gshadow
```
通过上述操作后,组管理员就获得了向组中添加和删除成员的权限
groupmod 用于修改指定组,只有超级用户才能使用此命令。该指令的执行将修改 /etc/group 文件相应记录的内容
修改组 id命令如下:
```shell
groupmod -g 105 teachers
```
-g: 改变组账号的 GID,组账号名保持不变
-n 选项用于改变组账号名,命令如下:
```shell
groupmod -n tutors teachers
```
## 切换用户名令
在Linux中,切换账户可以使用`su`或`sudo`命令:
1. **使用****`su`****命令**:
```bash
su - username
```
输入目标用户的密码后,即可切换到该用户。
2. **使用****`sudo -i`****命令**(需要sudo权限):
```bash
sudo -i -u username
```
这将以目标用户的身份启动一个新的登录Shell。
3. **切换回原账户**:
输入`exit`或按`Ctrl+D`即可返回到原账户。