别让 chmod 777 毁了一切!Linux 用户 & 组管理“降维实操”|小白秒变权限掌控者,附送避坑指南
前言🎊
刚学 Linux 是不是一摸到
useradd、/etc/passwd就脑袋发懵🤯? 分不清 UID 和 GID、分不清主组附加组,改完用户登录直接报错、权限乱套、家目录消失…… 别慌!本篇结合课堂完整实操笔记,全程大白话讲解 + 超多实操代码 + 红标高危坑点,搭配趣味图解逻辑,零基础看完就能独立完成服务器用户创建、权限分配、密码安全管控,新手直接收藏当工具书!
一、灵魂提问🤔:Linux 用户和组到底是干嘛的?
1. 用户:服务器里每个人的专属身份 ID
Linux 里文件、程序、登录操作全部绑定用户身份,人类看用户名,系统内核只认一串数字 UID!
三类用户清晰对照表🎯
表格
| 用户类型 | 典型账号 | UID 区间 | 核心特性 | 适用场景 |
|---|---|---|---|---|
| 至尊管理员 root | root | UID=0 | 服务器所有权限无限制,想删啥删啥 | 系统初始化、创建账号、修改核心配置文件 |
| 后台服务专用用户 | nginx、postfix | 201~999 | 禁止登录终端,shell 固定/sbin/nologin | 运行网站、邮件等后台服务,隔绝风险 |
| 普通日常用户 | jhl、operator | 1000~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 逐段拆解:
- jhl:登录账号名
- x:密码不存这里,加密密码单独存
/etc/shadow - 1000:UID 用户数字编号
- 1000:GID 主组数字编号
- software admin:用户备注(姓名、岗位)
- /home/jhl:登录默认文件夹
- /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
上一次登录:二 7月 18 11:19:14 CST 2026tty1 上
[laowang@centos7 ~]$ 登出
# 更改用户shell为 /sbin/nologin 不可登录模式
[root@centos7 ~]# usermod -s /sbin/nologin laowang
[root@centos7 ~]# su - laowang
上一次登录:二 7月 18 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 账号:
- 编辑
/etc/passwd,末尾新增用户行 - 编辑
/etc/group,新建同名主组 - 编辑
/etc/shadow,粘贴加密密码字符串 - 复制 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 7月 19 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 7月 19 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 一模一样的最高权限,两种实现方式:
- 手动编辑
/etc/passwd,修改用户 UID 字段为 0 - 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 大致命踩坑清单🚨,收藏避坑!
- 添加附加组忘记
-a参数,原有附加组全部清空丢失权限 - 复制 /etc/skel 模板末尾不加
/,生成嵌套文件夹,配置失效 - userdel 删除用户不加
-r,残留家目录长期占用磁盘空间 - 将用户 shell 改为
/sbin/nologin后,依旧尝试 su 切换登录 - PATH、PS1 环境变量仅临时生效,重启终端全部重置,未写入配置文件持久化
- 创建用户后忘记修改家目录归属,登录触发权限报错
- 使用 chage 混淆密码过期、账号过期两个参数,安全配置失效
七、全文干货总结🎯
- Linux 识别用户依靠 UID、识别组依靠 GID;
/etc/passwd存基础账号信息,/etc/shadow存放加密密码,权限严格管控; - 用户分为 root 管理员、系统服务用户、普通用户三类;每个用户仅有 1 个主组,可加入多个附加组实现灵活权限分配;
- 用户管理核心命令:useradd 创建、usermod 修改、userdel 删除;组管理对应 groupadd/groupmod/groupdel;
- chage 命令管控密码有效期、账号过期时间,是企业服务器安全加固必备操作;
- 所有自定义环境变量、用户配置想要永久生效,必须写入
/etc/profile、/etc/bashrc、~/.bashrc等登录配置文件; - 养成操作前用
id、grep验证用户信息的习惯,能规避 80% 登录、权限报错!
更多推荐




所有评论(0)