学习Linux——用户管理
《用户管理(User Management)》2025年10月27日
Linux操作系统是多用户多任务操作系统,用户管理负责创建、维护和删除用户账号,所有用户信息都存储在/etc/passwd,密码哈希存储在/etc/shadow,组信息存储在/etc/group。
用户管理围绕用户账号的生命周期展开,核心命令包括useradd:添加用户、usermod:修改用户、userdel:删除用户等
一、核心理论
用户ID(UID):系统识别用户的唯一数字标识。
0为root用户,1-999为系统用户 ,1000及以上为普通用户。
用户类型:
超级用户(root):拥有系统的全部权限,UID=0
系统用户:用于运行服务(如nginx、mysql) ,通常是不允许登录。
普通用户:由root创建,权限受限制
二、关键配置文件:
当我们创建一个用户时,这个用户会在以下几个地方写入值:
1、/home 目录下会创建一个与用户名相同的目录,在目录下有一些隐藏文件,这些文件来自于 /etc/skel 目录下的文件。
2、在 /var/spool/mail 目录下会创建一个与用户名同名的目录
3、会在 /etc/passwd 文件中添加一行记录
4、会在 /etc/shadow 文件中添加一行记录
5、会在 /etc/group 文件中添加一行记录
6、会在 /etc/gshadow 文件中添加一行记录
接下来我们着重讲几个关键的配置文件:
1、/etc/passwd(用户信息)
存储用户账号基本信息(格式:用户名:密码占位符:UID:GID:注释:家目录:登录shell(用户可执行的脚本))
[root@bogon ~]# tail -1 /etc/passwd (查看/etc/passwd文件末尾行)
user1:x:1001:1003::/home/user1:/bin/bash
解读:
用户名为user1:密码占位符是"x":用户的UID是1001:用户的GID是1003:个人信息为空 :家目录为"/home/user1" :登录shell(用户可执行的脚本)为"/bin/bash"
2、/etc/shadow(密码信息)
存储用户密码哈希及密码策略(格式:用户名:哈希值(用户的密码字符串):最后修改时间:最小有效期(密码修改间隔):最大有效期(密码的有效期):警告期(密码过期前的警告天数):过期宽限期:失效时间:保留)
[root@bogon ~]# tail -1 /etc/shadow(查看/etc/shadow文件末尾行)
user1::20388:0:99999:7:::
#此时为未设密码状态
[root@bogon ~]# passwd user1
Changing password for user user1.
New password: #a123
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: #a123
passwd: all authentication tokens updated successfully.
#利用passwd 命令设置密码为a123
[root@bogon ~]# tail -1 /etc/shadow
user1:$6$rounds=100000$Nr0TsPcz/3G0fT.Q$f3CEwUm2RVDOzEQ80Y9O7/Y4vAla96GbApWgnh9L7.4h/9dY7c24hFvMhbERshJiNgmTSs5lv4EBFKei7528I0:20388:0:99999:7:::
解读:
用户名称为user1:
该用户的密码字符串哈希值为“6$rounds=100·····IO”:
用户最后一次修改密码的时间为20388(表示从1970年1月1日起的第20388天):
密码的最小时间(密码修改间隔)为0表示可以随时修改密码:
密码的最大时间为99999,密码有效期天数约等于永久:
密码的宽限期(密码过期前七天进行警告,按照文件内容应该是99992天后警告):
密码的警告时间(过期后宽限天数为0,过期后立即锁定):
密码的过期时间为0表示该账号永久有效:保留(暂时没用,属于一个标记位)
拓展内容:密码加密(哈希值)
在 Linux 系统中,/etc/shadow 文件里的哈希值是用户密码的 “加密存储形式”,它不是明文密码字符串,而是通过密码哈希算法(单向哈希+盐值+迭代计算)处理后,用来报站密码的存储安全。
哈希的本质:密码的 “安全替身”
密码哈希是将用户设置的明文密码通过单向哈希算法(如 SHA-512、MD5 早期也用过,但现在已不安全)进行加密计算,得到一串不可逆的字符序列。
- 不可逆性:无法从哈希值反向推导出原始明文密码(这是哈希算法的核心特性,保障密码安全)。
- 验证逻辑:当用户登录时,系统会将用户输入的明文密码再次通过相同算法计算哈希,然后与
/etc/shadow中存储的哈希值比对 —— 若一致,则密码验证通过。
/etc/shadow 中哈希的格式解析
以上述提供的哈希部分$6$rounds=100000$Nr0TsPcz/3G0fT.Q$f3CEwUm2RVDOZEQ80Y9O7/Y4vAla96GbApwgn h9L7.4h/9dY7c24hFvMhbERshJiNgmTSs5lv4EBFKei7528I0为例,其结构可拆解为:
| 字段 | 含义 |
|---|---|
$6$ | 表示使用 SHA-512 哈希算法($1$是 MD5,$5$是 SHA-256,$6$是 SHA-512) |
rounds=100000 | 哈希计算的 “迭代次数”(次数越多,破解难度越大,这里是 10 万次) |
Nr0TsPcz/3G0fT.Q | 盐值(Salt):随机生成的字符串,与密码混合后哈希,防止 “彩虹表” 攻击 |
| 后面的长字符串 | 最终的密码哈希结果(由 “盐值 + 明文密码” 经过 SHA-512 算法迭代计算得到) |
3、/etc/group(组信息)
存储组账号基本信息(格式:组名:密码占位符:GID: 附加用户列表(组内成员))
[root@bogon ~]# tail -1 /etc/group
user1:x:1003:
解读:
组名为user1:密码占位符为x:GID值为1003:组内成员为空
三、常用操作命令
1、创建用户:useradd
-
语法:
useradd [选项] 用户名 -
核心用法:在系统中新增一个用户账号,并创建默认的家目录和组。
#在这里为大家演示最常用创建系统用户和普通用户的命令: #创建一个自动创建家目录的系统用户并指定用户的默认shell为/bin/bash [root@bogon ~]# useradd -m -r -s /bin/bash zhangsan [root@bogon ~]# id zhangsan uid=995(zhangsan) gid=995(zhangsan) groups=995(zhangsan)#创建一个自动创建家目录的普通用户并指定登录shell为/bin/bash [root@bogon ~]# useradd -m -s /bin/bash lisi [root@bogon ~]# id lisi uid=1002(lisi) gid=1004(lisi) groups=1004(lisi)注意观察:系统用户的ID值小于1000;普通用户的ID值大于1000 -
常见选项:
-d 目录:指定用户的家目录(默认:/home/用户名)。-m:强制创建家目录(若默认配置未开启则需手动指定)。-r:创建系统用户。-s Shell路径:指定用户的登录 Shell(如/bin/bash允许登录,/sbin/nologin禁止登录)。-u UID:手动指定用户的 UID(需确保唯一性)。-g 组名/组ID:指定用户的初始组(必须是已存在的组)。-G 组1,组2:指定用户的附加组(多个组用逗号分隔)。-c "注释":添加用户注释(如用户姓名、部门)。
2、查看用户
查看当前登录的用户
who 命令:显示当前登录系统的所有用户信息(用户名、终端、登录时间、IP 等)示例:
who
# 输出示例:
[root@bogon ~]# who
root tty1 2025-10-18 09:34
root pts/1 2025-10-27 16:01 (192.168.***.***)
w 命令:在 who 的基础上,额外显示用户当前的操作(更详细)示例:
w
# 输出示例:
[root@bogon ~]# w21:33:06 up 2 days, 17:58, 2 users, load average: 0.98, 0.46, 0.18
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root tty1 18Oct25 3days 0.31s 0.31s -bash
root pts/1 16:01 1.00s 0.12s 0.01s w
查看系统中所有用户(包括未登录的)
Linux 的用户信息存储在 /etc/passwd 文件中,可直接查看该文件或通过命令解析:
直接查看 /etc/passwd:该文件每行代表一个用户,解读方法参考上面
cat /etc/passwd
# 输出示例(截取部分):
root:x:0:0:root:/root:/bin/bash #root用户
bin:x:1:1:bin:/bin:/sbin/nologin # 系统用户(无登录权限)
zhangsan:x:1000:1000::/home/zhangsan:/bin/bash # 普通用户
cut 命令提取用户名:只显示所有用户的用户名(过滤 /etc/passwd 的第一列)
cut -d: -f1 /etc/passwd
id 命令查看指定用户详情:显示用户的 UID、GID 及所属组示例:
[root@bogon ~]# id lisi
uid=1002(lisi) gid=1004(lisi) groups=1004(lisi)
查看用户的登录历史
last 命令:显示用户的登录记录(包括登录时间、IP、退出时间等)
[root@bogon ~]# last lisi
# 查看指定用户(lisi)的登录历史wtmp begins Fri Oct 17 20:39:52 2025
[root@bogon ~]# last -n 5
# 只显示最近5条记录
root pts/1 192.168.**.** Mon Oct 27 16:01 still logged in
root pts/0 192.168.**.** Sun Oct 26 17:00 - 18:15 (1+01:15)
root pts/1 192.168.**.** Fri Oct 24 11:05 - 21:54 (10:49)
root pts/0 192.168.**.** Thu Oct 23 12:41 - 13:02 (1+00:21)
root pts/2 192.168.**.** Thu Oct 23 08:16 - 13:30 (05:14)wtmp begins Fri Oct 17 20:39:52 2025[root@bogon ~]# last -i
#查看IP
root pts/1 192.168.**.** Mon Oct 27 16:01 still logged in
root pts/0 192.168.**.** Sun Oct 26 17:00 - 18:15 (1+01:15)
..........
root tty1 0.0.0.0 Fri Oct 17 20:40 - crash (12:51)
reboot system boot 0.0.0.0 Fri Oct 17 20:39 still runningwtmp begins Fri Oct 17 20:39:52 2025
3、修改用户:usermod
-
语法:
usermod [选项] 用户名 -
核心用法:修改已存在用户的账号信息(如 UID、家目录、Shell 等)。
#展示常用命令 #将zhangsan用户改名为wangwu并修改其UID usermod -l wangwu -u 10086 zhangsan [root@bogon ~]# usermod -l wangwu -u 10086 zhangsan [root@bogon ~]# id zhangsan id: ‘zhangsan’: no such user [root@bogon ~]# id wangwu uid=10086(wangwu) gid=995(zhangsan) groups=995(zhangsan) -
常见选项:
-d 目录:修改用户的家目录(需配合-m才能移动原有家目录文件)。-l 新名称:修改用户的名称-m:移动用户家目录的内容到新目录(需与-d同时使用)。-s Shell路径:修改用户的登录 Shell。-u UID:修改用户的 UID(需确保新 UID 未被占用)。-g 组名/组ID:修改用户的初始组。-G 组1,组2:修改用户的附加组(覆盖原有附加组,若需新增需加-a)。-a:与-G配合,在原有附加组基础上新增组(而非覆盖)。-L:锁定用户账号(禁止登录,在/etc/shadow密码前加!)。-U:解锁用户账号(移除/etc/shadow密码前的!)。
4、删除用户:userdel
-
语法:
userdel [选项] 用户名 -
核心用法:从系统中删除用户账号。
[root@bogon ~]# userdel wangwu [root@bogon ~]# id wangwu id: ‘wangwu’: no such user -
常见选项:
-r:删除用户的同时,删除其家目录和邮件目录(若不加此选项,家目录会保留)。-f:强制删除用户(即使用户当前处于登录状态)。
5、设置用户密码:passwd
-
语法:
passwd [选项] 用户名 -
核心用法:修改用户的密码(普通用户只能修改自己的密码,root 可修改所有用户密码)。
#常用命令演示: [root@bogon ~]# tail -1 /etc/shadow #首先查看user1为设置密码状态 user1:!!:20388:0:99999:7::: [root@bogon ~]# passwd user1 #给user1设置密码 Changing password for user user1. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. #设置成功 [root@bogon ~]# tail -1 /etc/shadow user1:$6$rounds=100000$JzTIeH9bxZtwDtk/$lM3wWC/leROxtUvzgm8WBn.HdYbjY5UvOYgUO1cknikP1gCSI.LwW.:20388:0:99999:7:: #再次查看发现配置文件有所变化,解读参考上面 [root@bogon ~]# passwd -d user1 #清除密码 Removing password for user user1. passwd: Success #清除密码成功,重新查看配置文件 [root@bogon ~]# tail -1 /etc/shadow user1::20388:0:99999:7::: -
常见选项:
-l:锁定用户密码(与usermod -L功能类似)。-u:解锁用户密码(与usermod -U功能类似)。-d:清空用户密码(允许用户无密码登录,慎用)。-e:强制用户下次登录时修改密码。-n 天数:设置密码的最小有效期(用户在指定天数内不能修改密码)。-x 天数:设置密码的最大有效期(超过天数密码失效)。
