前言🎊

刚学 Linux 是不是一摸到useradd/etc/passwd就脑袋发懵🤯? 分不清 UID 和 GID、分不清主组附加组,改完用户登录直接报错、权限乱套、家目录消失…… 别慌!本篇结合课堂完整实操笔记,全程大白话讲解 + 超多实操代码 + 红标高危坑点,搭配趣味图解逻辑,零基础看完就能独立完成服务器用户创建、权限分配、密码安全管控,新手直接收藏当工具书!


一、灵魂提问🤔:Linux 用户和组到底是干嘛的?

1. 用户:服务器里每个人的专属身份 ID

Linux 里文件、程序、登录操作全部绑定用户身份,人类看用户名,系统内核只认一串数字 UID!

三类用户清晰对照表🎯

表格

用户类型典型账号UID 区间核心特性适用场景
至尊管理员 rootrootUID=0服务器所有权限无限制,想删啥删啥系统初始化、创建账号、修改核心配置文件
后台服务专用用户nginx、postfix201~999禁止登录终端,shell 固定/sbin/nologin运行网站、邮件等后台服务,隔绝风险
普通日常用户jhl、operator1000~60000权限受限,仅能读写自家 /home 家目录日常开发、测试、普通运维登录

💡冷知识彩蛋✨:用户名只是给人看的 “外号”,系统底层判断权限只认 UID 数字,改用户名不影响权限!

2. 用户组:批量分配权限的 “组队工具”

组 = 一堆用户的集合,给组开权限,组内所有人自动共享权限,不用逐个修改用户! 分为主组(主要组)附加组(补充组) 两种,区别一眼看懂:

主组 VS 附加组对比表

表格

分组类型硬性规则存储文件关键特点
主组一个用户有且仅有 1 个/etc/passwd第四列 GID用户新建文件 / 文件夹,默认归属自己的主组
附加组一个用户能加入 N 个/etc/group最后一列成员列表临时赋予额外权限,不会改变新建文件默认属组

举个生活化例子🍉: 用户 operator1 主组 operator1,额外加入 wheel 管理员附加组。平时写文件归属 operator1 组,需要执行 sudo 管理员命令时,依靠 wheel 组权限放行,两全其美!

3. 两大核心配置文件📂:存储全服务器用户 / 组数据

📁 /etc/passwd:所有用户基础信息库

每行 7 段内容,冒号:分割,

模板: name:password:UID:GID:GECOS:directory:shell

用户名:密码占位符x:UID:GID:备注信息:家目录:登录shell

示例: jhl:x:1000:1000:software admin:/home/jhl:/bin/bash 逐段拆解:

  1. jhl:登录账号名
  2. x:密码不存这里,加密密码单独存/etc/shadow
  3. 1000:UID 用户数字编号
  4. 1000:GID 主组数字编号
  5. software admin:用户备注(姓名、岗位)
  6. /home/jhl:登录默认文件夹
  7. /bin/bash:可交互登录终端;服务用户统一为/sbin/nologin

📁 /etc/group:全系统用户组信息库

每行 4 段,冒号分隔,

模板:group_name:password:GID:user_list

组名:占位符x:GID:组内附加用户

示例:wheel:x:10:jhl,operator1

  • wheel:管理员 sudo 专属组
  • 10:GID 组编号
  • jhl,operator1:组内附加成员,多用户用逗号隔开

二、4 条入门查询命令✨:先学会看用户,再动手创建

新手不要上来就创建账号,先学会查看在线用户,规避操作失误!

1. whoami

查看当前终端是谁

[root@centos7 ~]# whoami
root

简单粗暴,一眼确认当前操作身份,避免误删文件!

2. who /w

查看当前系统中所有终端上登录的用户,以及用户登录的时间。

# who 极简输出,只显示用户、终端、登录时间
who
# w 完整版,附带登录IP、空闲时长、正在运行的程序
w

在这里插入图片描述

3. users

查看当前系统中所有终端上登录的用户名。

在这里插入图片描述

4. id 万能查询命令🎯(排查权限神器)

一键输出用户 UID、主组、所有附加组,排错必用!
语法:

id  用户名

在这里插入图片描述


三、本地用户全套管理:增删改查实操 + 超多避坑预警

1. useradd 创建用户

# 用户1  自动生成同名主组、家目录/home/user01、可登录bash终端
[root@centos7 ~]# useradd user01
[root@centos7 ~]# grep user01 /etc/passwd
user01:x:1003:1003::/home/user01:/bin/bash

# 用户2
[root@centos7 ~]# useradd -u 8888 -d /opt/user02 -c "user for software manage" -g wheel -s /sbin/nologin user02
# -u uid
# -d 用户的家目录
# -c 描述信息
# -g 用户的主组
# -s 用户shell程序

[root@centos7 ~]# grep user02 /etc/passwd
user02:x:8888:10:user for software manager:/opt/user02:/sbin/nologin
[root@centos7 ~]# ls -d /opt/user02/
/opt/user02/

# 创建一个没有密码的账户,该用户在图形化界面中可以直接登录
[root@centos7 ~]# useradd -p '' tom

自定义参数创建(企业运维标准写法)

参数速查表:

参数功能说明
-u手动指定 UID 编号
-d自定义家目录路径
-c填写用户岗位 / 姓名备注
-g指定用户主组
-s修改登录 shell

⚠️新手巨坑 1:家目录模板来源 /etc/skel

新建用户家目录里的.bashrc.bash_profile等隐藏配置,全部复制自/etc/skel模板文件夹! 一旦误删/etc/skel,新用户登录直接弹出bash-4.2$空白提示符,体验直接崩盘!

🚨新手巨坑 2:复制目录不加斜杠,疯狂嵌套文件夹

手动恢复丢失家目录时,千万不要写: cp /etc/skel /home/zhangsan 错误后果:生成/home/zhangsan/skel嵌套文件夹,配置全部藏在子目录里! ✅正确写法(末尾必须带/): cp -r /etc/skel/ /home/zhangsan

2. usermod 修改用户全部属性

场景 1:修改 UID、迁移家目录

# -m 参数自动迁移原有文件到新家目录,缺一不可
[root@centos7 ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash
[root@centos7 ~]# grep user02 /etc/passwd
user02:x:1008:10:user for software manager:/home/user02:/bin/bash
[root@centos7 ~]# ls -d /home/user02/
/home/user02/

[root@centos7 ~]# su - user02
Last login: Mon Nov  7 17:08:58 CST 2022 on pts/2
[user02@centos7 ~]$

场景 2:给用户添加附加组(重中之重!)

# -a = append追加,不加-a会直接清空原有所有附加组!
[root@centos7 ~]# usermod -aG user01 user02
[root@centos7 ~]# id user02
uid=1008(user02) gid=10(wheel) groups=10(wheel),1003(user01)

💥致命踩坑提醒:去掉-a只写usermod -G,用户原有附加组全部清空,权限直接丢失!

场景 3:锁定 / 解锁账号密码

# 锁定账号,正确密码也无法登录
[root@centos7 ~]# usermod -L laowang
[jhl@centos7 ~]$ su - laowang
Password: 
su: Authentication failure

# 解锁,恢复密码登录权限
[root@centos7 ~]# usermod -U laowang

# 输入正确的密码登录
[jhl@centos7 ~]$ su - laowang
Password: 
[laowang@centos7 ~]$

场景 4:限定用户shell

# 默认情况下,root用户可以切换到任何用户而且不需要密码
[root@centos7 ~]# su - laowang
上一次登录:二 718 11:19:14 CST 2026tty1 上
[laowang@centos7 ~]$ 登出

# 更改用户shell为 /sbin/nologin 不可登录模式
[root@centos7 ~]# usermod -s /sbin/nologin laowang
[root@centos7 ~]# su - laowang
上一次登录:二 718 11:21:23 CST 2026pts/0 上
This account is currently not available.

# 将用户shell改为/bin/bash
[root@centos7 ~]# usermod -s /bin/bash laowang

场景 5:更改用户密码

# 更改jhl的密码与laowang一致
[root@centos7 ~]# grep laowang /etc/shadow
laowang:$6$dQcDSqtz$Nboi6QLMzscWSLvnnRO86gm3XI/qbgfnK5zVv2Ix13EktQ97vwNsqQlrfI2K/b1mVnHNgzmMNIb0P4HnTugog/:19304:0:99999:7:::
[root@centos7 ~]# usermod -p '$6$dQcDSqtz$Nboi6QLMzscWSLvnnRO86gm3XI/qbgfnK5zVv2Ix13EktQ97vwNsqQlrfI2K/b1mVnHNgzmMNIb0P4HnTugog/' jhl

# 删除用户密码 
[root@centos7 ~]# usermod -p '' jhl

场景 6:设置账户过期

等效于passwd -e

# 设置账户过期时间为过去的某一个日期
[root@centos7 ~]# usermod -e 2029-7-18 laowang

# 或者
[root@centos7 ~]# chage -E 2029-7-18 laowang

3. userdel 删除用户

# 正常删除,仅删除账号,保留家目录文件(推荐,防止误删业务数据)
[root@centos7 ~]# useradd user03
[root@centos7 ~]# userdel user03

# -r 参数:账号+家目录+邮件全部清空
[root@centos7 ~]# userdel -r user03

# 强制删除
[root@centos7 ~]# userdel user02
userdel: user user02 is currently used by process 9071
[root@centos7 ~]# id user02
uid=1008(user02) gid=10(wheel) groups=10(wheel),1003(user01)
# 尽量不要强制删除,要找到无法删除的原因
[root@centos7 ~]# userdel -f user02
userdel: user user02 is currently used by process 9071
[root@centos7 ~]# id user02
id: user02: no such user

⚠️重要提醒:用户正在登录、后台有进程运行时,无法正常删除账号,不要强行加-f强制删除,先找到并关闭对应进程!

实操完整脚本(可直接复制运行)

需求:创建 operator1 用户,完成全套配置验证

# 1. 创建基础用户
[root@centos7 ~]useradd operator1
# 2. 查看用户UID、所有组信息
[root@centos7 ~]id operator1
# 3. 查看/etc/passwd内用户配置行
[root@centos7 ~]grep operator1 /etc/passwd
# 4. 设置登录密码redhat
[root@centos7 ~]passwd operator1
# 5. 修改用户UID为1088
[root@centos7 ~]usermod -u 1088 operator1
# 6. 添加用户描述备注
[root@centos7 ~]usermod -c "Operator One" operator1
# 7. 加入wheel管理员附加组
[root@centos7 ~]usermod -aG wheel operator1
# 8. 查看wheel组内所有成员
[root@centos7 ~]grep wheel /etc/group
# 9. 删除用户并清理家目录
[root@centos7 ~]userdel -r operator1

拓展知识点📝:手动从零创建用户(面试高频考点)

不使用 useradd 命令,手动修改 4 个系统文件,完整新建 zhangsan 账号:

  1. 编辑/etc/passwd,末尾新增用户行
  2. 编辑/etc/group,新建同名主组
  3. 编辑/etc/shadow,粘贴加密密码字符串
  4. 复制 skel 模板到家目录,修改文件归属用户组
# 1 添加账户
[root@centos7 ~]# vim /etc/passwd
# 最后一行添加如下内容,注意uid要在原有的基础上增加1
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash


# 2 添加组
[root@centos7 ~]# vim /etc/group
# 最后一行添加如下内容
zhangsan:x:1002:

# 3 添加密码
[root@centos7 ~]# vim /etc/shadow
# 最后一行添加如下内容
zhangsan:$6$FgUNKn74yoEDbcXD$pxDk9AEhsxkJGYi76Rv91zLy5LRns8olgAyGuNssQYG07ypaidhuX0gHAU4hrNi9Zp9A7vtMEvbyzCQ0e/gbk1::0:99999:7:::

# 4 准备家目录
[root@centos7 ~]# cp -r /etc/skel/ /home/zhangsan
# 修改zhangsan家目录所属有zhangsan用户和组
[root@centos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan
[root@centos7 ~]# ll -d /home/zhangsan
drwxr-xr-x. 16 zhangsan zhangsan 4096 719 14:00 zhangsan

# 测试
[root@centos7 ~]# ssh zhangsan@localhost

三大登录故障一键修复方案💡

故障 1:登录只显示bash-4.2$,无正常彩色提示符

诱因:系统全局配置/etc/bashrc丢失 / 改名 修复:还原文件,重新打开终端即可恢复正常提示符
提示符如下: bash-4.2$

模拟:

[root@centos7 ~]# mv /etc/bashrc{,.ori}
[root@centos7 ~]# bash
bash-4.2# 

原因:nologin shell打开的时候执行 /etc/bashrc 配置。

恢复:

bash-4.2# mv /etc/bashrc{.ori,}
bash-4.2# bash
[root@centos7 ~]# 

故障 2:登录报错Could not chdir to home directory

诱因:用户家目录被误删 修复:复制 skel 模板,修改文件夹归属用户组

故障:

[root@centos7 ~]# ssh zhangsan@localhost
zhangsan@localhost's password: 
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Fri Jul 19 14:13:47 2024 from ::1
Could not chdir to home directory /home/zhangsan: No such file or directory
-bash-4.2$ 

模拟:

[root@centos7 ~]# rm -fr /home/zhangsan

解决

[root@centos7 ~]# cp -r /etc/skel/ /home/zhangsan
[root@centos7 ~]# chown zhangsan:zhangsan /home/zhangsan

故障 3:切换用户提示Permission denied无法进入家目录

诱因:家目录权限过严,用户无读写进入权限 修复命令: chmod u=rwx /home/用户名 && chown -R 用户:用户主组 /home/用户名

故障

Could not chdir to home directory /home/zhangsan: Permission denied
-bash: /home/zhangsan/.bash_profile: 权限不够

模拟

[root@centos7 ~]# chmod u=- /home/zhangsan

解决

[root@centos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan
[root@centos7 ~]# chmod u=rwx /home/zhangsan
[root@centos7 ~]# ll -d /home/zhangsan
drwx------. 3 zhangsan zhangsan 78 719 14:17 /home/zhangsan
------

四、用户组全套管理:增删改查完整实操

1. groupadd 创建用户组

# 创建名称为 admin 的组
[root@centos7 ~]# groupadd admin

# 创建名称为sysadmin的组,组id为2000
[root@centos7 ~]# groupadd sysadmin -g 2000

# 验证
[root@centos7 ~]# grep admin /etc/group
printadmin:x:997:
admin:x:1002:
sysadmin:x:2000:

2. groupmod 修改组名称、GID

# 修改组名称
[root@centos7 ~]# groupmod --new-name admins admin

# 修改组id
[root@centos7 ~]# groupmod -g 2002 admins

# 验证
[root@centos7 ~]# grep 'admins' /etc/group
admins:x:2002:

3. groupdel 删除用户组


[root@centos7 ~]# groupdel sysadmin 
[root@centos7 ~]# grep sysadmin /etc/group

4. groupmems 精细化管理组内成员

不用 usermod,单独针对组增删用户,适合批量运维:

[root@centos7 ~]# groupmems --help
用法:groupmems [选项] [动作]

选项:
  -g, --group groupname         更改组 groupname,而不是用户的组(只 root)
  -R, --root CHROOT_DIR         chroot 到的目录

动作:
  -a, --add username            将用户 username 添加到组成员中
  -d, --delete username         从组的成员中删除用户 username
  -h, --help                    显示此帮助信息并推出
  -p, --purge                   从组中移除所有成员
  -l, --list                    列出组中的所有成员

# 添加成员
[root@centos7 ~]# groupmems -g admins -a laowang
[root@centos7 ~]# groupmems -g admins -l
laoma
[root@centos7 ~]# id laoma
uid=1000(laoma) gid=1000(laoma)=1000(laoma),10(wheel),2002(admins)

# 删除成员
[root@centos7 ~]# groupmems -g admins -d laowang
[root@centos7 ~]# groupmems -g admins -l

# 清空组中所有成员
[root@centos7 ~]# groupmems -g admins -a laoli
[root@centos7 ~]# groupmems -g admins -p

组管理练习完整命令合集

需求:创建 developer 组,修改参数、添加用户、最后删除

# 1. 创建developer组,指定GID=2000
groupadd -g 2000 developer
# 2. 修改组名developers,GID改为3000
groupmod -g 3000 --new-name developers developer
# 3. 创建developer1用户,加入developers附加组
useradd developer1
usermod -aG developers developer1
# 4. 将developer1从developers组移除
groupmems -g developers -d developer1
# 5. 删除空组developers
groupdel developers

五、密码安全管控:/etc/shadow 加密文件 + chage 时效配置

1. /etc/shadow 加密密码核心文件🔒

🚨高危提醒:该文件权限严格,仅 root 管理员可读,普通用户无任何查看权限,存放所有用户加密登录密码!
每行包含一个登录用户信息,以冒号分隔九个域。
示例:

[root@centos7 ~]# grep jhl /etc/shadow
jhl:$6$m0OgWyIu$P2TF1pB8MO...J3LopEUdhmp/Ir/:19300:0:99999:7:::

解释如下:

  • login name:用户登录名。

  • encrypted password:加密的密码。

  • date of last password change:上一次密码更改日期,以距离1970-1-1过去的天数表示。设置为0,强制用户下次登录时更改密码。

  • minimum password age:最小密码生命周期。设置为0,密码可以随时更改。

  • maximum password age:最大密码生命周期。

  • password warning period:密码过期前,提前多少天告警。设置为0,不提示过期。

  • password inactivity period:密码过期后,非活跃天数,在期间密码仍可以使用。

  • account expiration date:账户过期时间,以距离1970-1-1过去的天数表示。

  • reserved field:保留域。

2. chage 密码生命周期管理(服务器安全加固必备)

# 查看用户密码信息
[root@centos7 ~]# chage -l jhl
最近一次密码修改时间                  :7月 18, 2026
密码过期时间                  :从不
密码失效时间                  :从不
帐户过期时间                      :从不
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :99999
在密码过期之前警告的天数    :7

# 修改用户密码要求,100天后密码自动过期
[root@centos7 ~]# chage -M 100 jhl
[root@centos7 ~]# chage -l jhl
最近一次密码修改时间                  :7月 18, 2026
密码过期时间                  :9月 16, 2026
密码失效时间                  :从不
帐户过期时间                      :从不
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :100

# 最少10天才能改密码
[root@centos7 ~]# chage -m 10 jhl
[root@centos7 ~]# chage -l jhl
最近一次密码修改时间                  :7月 18, 2026
密码过期时间                  :9月 16, 2026
密码失效时间                  :从不
帐户过期时间                      :从不
两次改变密码之间相距的最小天数     :10
两次改变密码之间相距的最大天数     :100
在密码过期之前警告的天数    :7

# 用户下次登录强制重置密码
[root@centos7 ~]# chage -d 0 jhl
# 验证
[root@centos7 ~]# ssh jhl@localhost
jhl@localhost's password: 
You are required to change your password immediately (root enforced)
Last login: Tue Nov  18 11:13:51 2026 from localhost
WARNING: Your password has expired.
You must change your password now and login again!
更改用户 jhl 的密码 。
为 jhl 更改 STRESS 密码。
(当前)UNIX 密码:

# 设置用户密码过期时间是过去的一个时间,以便确保用户密码过期,登录时强制用户更改密码
# 设置为1,确保密码很久未改动
[root@centos7 ~]# chage -d 1 jhl

# 设置用户账户过期时间是过去的一个时间,以便锁定用户账户
[root@centos7 ~]# chage -E 1970-1-1 jhl

用户账号管控需求速查表📋

业务需求对应命令
正常设置登录密码passwd 用户名
复制他人加密密码(禁止使用 passwd 交互)usermod -p “加密字符串” 用户名
清空密码,免密登录passwd -d 用户名
锁定密码,禁止登录usermod -L / passwd -l
解锁锁定账号usermod -U / passwd -u
永久禁止用户登录终端usermod -s /sbin/nologin
用户登录强制修改密码chage -d 0

高危拓展:UID=0 万能权限账号⚠️

root 账号之所以拥有全服务器权限,核心原因是 UID 固定为 0!任意用户 UID 改为 0,就能获得和 root 一模一样的最高权限,两种实现方式:

  1. 手动编辑/etc/passwd,修改用户 UID 字段为 0
  2. useradd 创建时添加参数-o -u 0 生产环境严禁使用,属于服务器高危后门,运维红线!

增加一个 uid 为 0 的用户

方法一

[root@centos7 ~]# vim /etc/passwd
# 将自己的用户id该为0,此时jhl用户可以行使root权限了
jhl:x:0:1000:jhl:/home/jhl:/bin/bash

方法二

[root@centos7 ~]# useradd -o -u 0 jhl
[root@centos7 ~]# id jhl
uid=0(root) gid=0(root)=0(root)

jhl 和 root 账户是两个不同的账户,但是jhl用户获得了root账户权限。


六、新手 7 大致命踩坑清单🚨,收藏避坑!

  1. 添加附加组忘记-a参数,原有附加组全部清空丢失权限
  2. 复制 /etc/skel 模板末尾不加/,生成嵌套文件夹,配置失效
  3. userdel 删除用户不加-r,残留家目录长期占用磁盘空间
  4. 将用户 shell 改为/sbin/nologin后,依旧尝试 su 切换登录
  5. PATH、PS1 环境变量仅临时生效,重启终端全部重置,未写入配置文件持久化
  6. 创建用户后忘记修改家目录归属,登录触发权限报错
  7. 使用 chage 混淆密码过期、账号过期两个参数,安全配置失效

七、全文干货总结🎯

  1. Linux 识别用户依靠 UID、识别组依靠 GID;/etc/passwd存基础账号信息,/etc/shadow存放加密密码,权限严格管控;
  2. 用户分为 root 管理员、系统服务用户、普通用户三类;每个用户仅有 1 个主组,可加入多个附加组实现灵活权限分配;
  3. 用户管理核心命令:useradd 创建、usermod 修改、userdel 删除;组管理对应 groupadd/groupmod/groupdel;
  4. chage 命令管控密码有效期、账号过期时间,是企业服务器安全加固必备操作;
  5. 所有自定义环境变量、用户配置想要永久生效,必须写入/etc/profile/etc/bashrc~/.bashrc等登录配置文件;
  6. 养成操作前用id、grep验证用户信息的习惯,能规避 80% 登录、权限报错!
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐