Linux 用户和用户组管理详解(新手详细版)
本文档面向零基础新手,从“Linux 里谁在用、怎么区分权限”讲起,详细说明用户、用户组、相关配置文件、增删改查、密码、切换身份、sudo 等,并配有大量示例。
一、为什么要学“用户和用户组”?
在 Linux 里:
- 每个进程都会以某个用户的身份运行。
- 每个文件都有所有者(属主)和所属组(属组)。
- 系统通过用户和用户组来决定“谁可以做什么”。
学会用户和用户组管理,你才能:新建账号、改密码、把用户加入某个组、用 sudo 临时提权、理解为什么有些命令要加 sudo。下面从最基础的概念讲起。
二、核心概念
2.1 用户(User)
- 用户就是系统里的一个“账号”,用来登录、运行程序、拥有文件。
- 每个用户有一个用户名(如 zhangsan)和一个用户 ID(UID),系统内部更多用 UID 区分。
- 分为两类常见说法:
- root:超级管理员,UID 为 0,权限最大。
- 普通用户:UID 一般从 1000 起(各发行版可能不同),权限受限制。
还有系统用户(如 www-data、nginx),UID 较小,一般不用于登录,只用于跑服务。
2.2 用户组(Group)
- 用户组把多个用户归为一组,便于批量给权限:把某个目录的属组设为 dev,那 dev 组里所有人都有一份相同的权限。
- 每个组有组名和组 ID(GID)。
- 每个用户至少属于一个组,这个组叫主组(primary group);还可以加入多个附加组(supplementary groups)。
2.3 属主、属组与权限的关系(回顾)
- 文件的属主:拥有该文件的用户。
- 文件的属组:拥有该文件的组;组内成员共享“属组权限”。
- 权限分三组:属主、属组、其他人(r/w/x)。
所以:用户身份 = 属主?属组成员?还是其他人? → 决定用哪一组权限。
# 看一个文件的属主、属组
ls -l /etc/passwd
# -rw-r--r-- 1 root root ... /etc/passwd
# ↑ ↑
# 属主 属组
三、用户和组的信息存在哪里?
3.1 /etc/passwd:用户账号信息(不含密码)
每一行一个用户,字段用冒号 : 分隔。
cat /etc/passwd
典型一行示例:
zhangsan:x:1000:1000:张三:/home/zhangsan:/bin/bash
| 字段顺序 | 含义 | 上例中的值 |
|---|---|---|
| 1 | 用户名 | zhangsan |
| 2 | 密码占位(真实密码在 /etc/shadow) | x |
| 3 | UID | 1000 |
| 4 | 主组 GID | 1000 |
| 5 | 注释/全名等(GECOS) | 张三 |
| 6 | 主目录 | /home/zhangsan |
| 7 | 登录 Shell | /bin/bash |
若第 7 字段是 /usr/sbin/nologin 或 /bin/false,表示该用户不能登录(常用于系统账号)。
3.2 /etc/shadow:密码与过期信息(仅 root 可读)
存的是加密后的密码和过期、锁定等安全信息。普通用户无法查看。
sudo cat /etc/shadow
一行示例:
zhangsan:$6$xxx...:19000:0:99999:7:::
常见字段:用户名、加密密码、上次改密码天数、最小间隔、最大有效天数、警告天数等。
密码为 ! 或 * 通常表示不能登录(未设密码或已禁用)。
3.3 /etc/group:组信息
每一行一个组,格式:
组名:密码占位:GID:属于该组的用户列表(逗号分隔,不含主组)
cat /etc/group
示例:
zhangsan:x:1000:
devteam:x:1001:zhangsan,lisi
zhangsan的主组是 GID 1000(zhangsan 组)。devteam组 GID 1001,附加组成员有 zhangsan、lisi。
3.4 /etc/gshadow:组密码等(可选,少用)
存组的密码(若启用),一般新手不用改,了解即可。
四、查看“当前用户”和“属于哪些组”
4.1 当前是谁:whoami
whoami
# 输出当前登录用户名,例如:zhangsan
4.2 详细身份:id
id
# 输出当前用户的 UID、GID、所属组列表
示例输出:
uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan),1001(devteam)
看指定用户:
id zhangsan
id root
4.3 当前用户属于哪些组:groups
groups
# 输出:zhangsan devteam
groups lisi
# 输出 lisi 所属的组
4.4 谁在登录:who、w
who
# 当前登录的用户、终端、登录时间
w
# 更详细:谁在做什么(当前执行的命令)
五、添加用户
5.1 useradd(通用)
需要 root 权限,一般用 sudo:
sudo useradd 用户名
这样会:
- 在
/etc/passwd、/etc/group里添加一行; - 主组默认与用户名同名的组;
- 主目录默认不创建(取决于发行版),Shell 多为
/bin/sh。
常用选项:
| 选项 | 含义 |
|---|---|
-m |
创建主目录(如 /home/用户名) |
-s |
指定登录 Shell,如 -s /bin/bash |
-c |
注释(全名等),如 -c "张三" |
-d |
指定主目录路径 |
-g |
指定主组(组名或 GID) |
-G |
指定附加组(多个用逗号) |
-u |
指定 UID |
-e |
账号过期日期 |
5.2 示例:创建一个“像正常人用”的用户
# 创建用户,并创建主目录、使用 bash
sudo useradd -m -s /bin/bash -c "张三" zhangsan
# 查看是否在 passwd 里
grep zhangsan /etc/passwd
# zhangsan:x:1001:1001:张三:/home/zhangsan:/bin/bash
# 主目录是否创建
ls -ld /home/zhangsan
此时用户还没有密码,需要设置后才能用密码登录:
sudo passwd zhangsan
# 按提示输入两次新密码
5.3 adduser(Debian/Ubuntu 推荐)
在 Debian、Ubuntu 上,adduser 是交互式脚本:会自动创建主目录、提示设密码、创建同名组等,对新手更友好。
sudo adduser lisi
# 会提示输入密码、全名等
创建完成后可检查:
grep lisi /etc/passwd
id lisi
六、修改用户:usermod
需要 root,用 sudo usermod 选项 用户名。
6.1 常用选项
| 选项 | 含义 |
|---|---|
-s |
改登录 Shell,如 -s /bin/bash 或 -s /usr/sbin/nologin |
-d |
改主目录路径(不自动迁移文件,一般配合 -m 移动内容) |
-m |
与 -d 一起用时,把旧主目录内容移到新主目录 |
-c |
改注释(全名) |
-l |
改用户名(登录名) |
-g |
改主组 |
-G |
改附加组(会覆盖原有附加组!想“追加”用 -aG) |
-aG |
把用户追加到某组(不删掉原有附加组) |
-L |
锁定账号(不能登录) |
-U |
解锁账号 |
-e |
账号过期日期 |
6.2 示例
# 把 zhangsan 的 Shell 改为禁止登录(适合做系统账号)
sudo usermod -s /usr/sbin/nologin zhangsan
# 改回 bash
sudo usermod -s /bin/bash zhangsan
# 把 zhangsan 加入 devteam 组(追加,不删原有组)
sudo usermod -aG devteam zhangsan
groups zhangsan
# zhangsan devteam
# 锁定账号(shadow 里密码前会加 !)
sudo usermod -L zhangsan
# 解锁
sudo usermod -U zhangsan
注意:-G 会覆盖附加组,只想“多加一个组”时一定要用 -aG。
七、删除用户:userdel
需要 root。
sudo userdel 用户名
- 只删账号(passwd/shadow 等),不删主目录。
- 若想连主目录一起删:
sudo userdel -r 用户名。
# 只删账号
sudo userdel tempuser
# 删账号并删主目录(谨慎!)
sudo userdel -r tempuser
若该用户正在登录或有进程在跑,可能删不掉,需先踢出或结束进程。
八、密码管理
8.1 为自己设密码:passwd(无参数)
passwd
# 提示输入当前密码,再输入两次新密码
8.2 root 为别人设密码:passwd 用户名
sudo passwd zhangsan
# 直接输入两次新密码,不需要知道旧密码
8.3 锁定/解锁用户密码(禁止登录)
# 锁定:用户无法用密码登录
sudo passwd -l zhangsan
# 解锁
sudo passwd -u zhangsan
8.4 清空密码(设为空,危险,少用)
sudo passwd -d zhangsan
8.5 过期与策略(可选了解)
# 查看某用户密码状态(过期等)
sudo passwd -S zhangsan
# 强制用户下次登录改密码
sudo passwd -e zhangsan
九、切换用户身份:su 与 sudo
9.1 su:切换到另一用户(并加载其环境)
# 切换到 root(会提示输入 root 密码)
su -
# 切换到 zhangsan(会提示输入 zhangsan 的密码)
su - zhangsan
su -会加载目标用户的登录环境(主目录、环境变量等)。su zhangsan(没有-)只换身份,不彻底切环境。
退出该用户回到原来:
exit
# 或 Ctrl+D
9.2 sudo:用当前用户密码“临时以 root 执行一条命令”
不需要知道 root 密码,只要当前用户在 sudoers 里被允许即可。
sudo 命令
# 例如:
sudo apt update
sudo useradd newuser
第一次用可能提示输入当前用户自己的密码,之后一段时间内可能不再问。
9.3 以其他用户身份执行一条命令(sudo -u)
sudo -u zhangsan whoami
# 输出:zhangsan
sudo -u www-data cat /var/www/html/index.html
9.4 配置谁能用 sudo:/etc/sudoers 与 sudo 组
- 不要直接
vim /etc/sudoers改,容易语法错误导致所有人都无法 sudo。 - 推荐:
sudo visudo,有语法检查。 - 常见做法:把用户加入 sudo 组(或 wheel 组,视发行版而定),该组默认在 sudoers 里:
sudo usermod -aG sudo zhangsan
# 或
sudo usermod -aG wheel zhangsan
加入后,该用户重新登录后即可使用 sudo。
十、用户组管理
10.1 创建组:groupadd
sudo groupadd 组名
# 指定 GID
sudo groupadd -g 2000 devteam
10.2 修改组:groupmod
# 改组名
sudo groupmod -n newname oldname
# 改 GID
sudo groupmod -g 2001 devteam
10.3 删除组:groupdel
sudo groupdel 组名
若某用户的主组是该组,需先把该用户的主组改掉或先删用户,才能删组。
10.4 把用户加入组 / 从组里移除
方法一:usermod -aG(追加到附加组)
sudo usermod -aG devteam zhangsan
groups zhangsan
方法二:gpasswd
# 把用户加入组
sudo gpasswd -a zhangsan devteam
# 把用户从组里移除
sudo gpasswd -d zhangsan devteam
注意:改组后,要重新登录(或新开一个终端用 newgrp 组名)后,新组才在 id、groups 里生效。
10.5 查看组里有哪些用户
# 看 /etc/group 里该组那一行(最后一列是附加组成员)
grep devteam /etc/group
# devteam:x:1001:zhangsan,lisi
# 或用 getent(会查 NIS/LDAP 等)
getent group devteam
十一、主组与附加组(再强调一下)
- 主组(primary group):用户创建文件时,默认的“属组”就是这个主组;在
/etc/passwd里 GID 那列。 - 附加组:在
/etc/group里各组的最后一列列出;用于额外授权,不改变“默认属组”。
# 查看主组和所有组
id zhangsan
# uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan),1001(devteam)
# ↑ 主组 ↑ 所有组(含主组)
把用户加入某组用 usermod -aG 组名 用户名,改主组用 usermod -g 组名 用户名(少用)。
十二、一条龙示例:从建组、建用户到授权
下面在一台机器上演示:建组 → 建用户 → 设密码 → 加入组 → 用 sudo。
# 1. 创建组
sudo groupadd devteam
# 2. 创建用户并加入组(创建时指定附加组)
sudo useradd -m -s /bin/bash -c "开发-张三" zhangsan
sudo usermod -aG devteam zhangsan
# 3. 设密码
sudo passwd zhangsan
# 4. 让 zhangsan 能用 sudo(加入 sudo 组)
sudo usermod -aG sudo zhangsan
# 5. 验证
id zhangsan
# uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),1002(devteam),1003(sudo)
grep zhangsan /etc/passwd
getent group devteam
然后可以用另一终端或 SSH 用 zhangsan 登录,执行 groups、sudo whoami 验证。
十三、与文件权限的配合(简要)
- 新建文件的属主=当前用户,属组=当前用户的主组。
- 若希望某目录下新建文件属组固定为 devteam,可:
- 把目录属组设为 devteam;
- 给目录设 setgid(chmod g+s),这样新建文件会自动继承目录的属组。
sudo chown :devteam /opt/project
sudo chmod g+s /opt/project
# 之后 zhangsan、lisi 在该目录下创建的文件,属组都会是 devteam
十四、安全与习惯建议(新手必读)
- 日常不用 root 登录:用普通用户 + 需要时
sudo。 - 强密码:尤其是 root 和能 sudo 的用户。
- 禁用不需要登录的用户:
usermod -s /usr/sbin/nologin或passwd -l。 - 慎用 userdel -r:确认主目录里没有重要数据再删。
- 改 sudoers 用 visudo:不要直接编辑
/etc/sudoers。 - 加组用 -aG:避免
usermod -G覆盖原有附加组。
十五、命令速查表
| 需求 | 命令示例 |
|---|---|
| 当前用户 | whoami、id |
| 当前用户所属组 | groups |
| 谁在登录 | who、w |
| 看用户/组配置 | cat /etc/passwd、cat /etc/group、getent group 组名 |
| 添加用户 | sudo useradd -m -s /bin/bash 用户名、sudo adduser 用户名 |
| 设密码 | passwd(自己)、sudo passwd 用户名(别人) |
| 改用户 | sudo usermod -aG 组名 用户名、sudo usermod -s /bin/bash 用户名 |
| 删用户 | sudo userdel 用户名、sudo userdel -r 用户名 |
| 锁定/解锁 | sudo passwd -l 用户名、sudo passwd -u 用户名 |
| 创建组 | sudo groupadd 组名 |
| 删组 | sudo groupdel 组名 |
| 用户加入组 | sudo usermod -aG 组名 用户名、sudo gpasswd -a 用户 组 |
| 用户离开组 | sudo gpasswd -d 用户 组 |
| 切换用户 | su -、su - 用户名 |
| 以 root 执行一条 | sudo 命令 |
| 以某用户执行一条 | sudo -u 用户名 命令 |
| 配置 sudo | sudo visudo、把用户加入 sudo 组 |
十六、小结
- 用户:账号、UID、root/普通用户;信息在
/etc/passwd,密码在/etc/shadow。 - 用户组:组名、GID;信息在
/etc/group;主组 + 附加组决定权限。 - 常用操作:
useradd/adduser、usermod、userdel、passwd、groupadd、groupdel、usermod -aG、gpasswd。 - 身份与权限:
whoami、id、groups;切换用su、临时提权用sudo;改 sudo 用visudo或把用户加入 sudo 组。
建议在虚拟机或测试机上按本文示例练习,再结合 Linux简介.md、Linux文件基本属性.md 理解“属主、属组、权限”的关系,这样用户和用户组管理就串起来了。
文档以常见 Linux 发行版(如 Ubuntu、Debian、CentOS)为准;不同发行版在 UID 范围、默认组名(sudo/wheel)上可能略有差异。