用户和用户组
一、核心概念
Linux 是多用户系统,每个登录身份都是一个用户(User),多个用户又可以归为一个用户组(Group),用来批量授权。
- 用户:有唯一的
UID,root 的 UID 固定为0。 - 用户组:有唯一的
GID。分主组(primary group,用户只能有一个)和附加组(supplementary group,可以有多个)。 - 权限判断:系统只看
UID/GID,不看用户名。所以删掉用户再重建同名用户,UID 变了,文件归属就“换人”了。
三个关键文件:
| 文件 | 作用 |
|---|---|
/etc/passwd | 用户信息:用户名:x:UID:GID:描述:家目录:登录shell |
/etc/shadow | 加密后的密码及有效期(普通用户不可读) |
/etc/group | 组信息:组名:x:GID:组内成员 |
cat /etc/passwd
id deploy ## 查看用户 UID/GID 和所属组

二、常用命令速查
| 命令 | 作用 | 常用写法 |
|---|---|---|
useradd | 创建用户 | useradd -m -s /bin/bash deploy |
passwd | 设置/修改密码 | passwd deploy |
usermod | 修改用户 | usermod -aG docker deploy |
userdel | 删除用户 | userdel -r deploy |
groupadd | 创建组 | groupadd devops |
groupdel | 删除组 | groupdel devops |
gpasswd | 管理组成员 | gpasswd -a deploy devops |
id / whoami / groups | 查看身份 | id deploy |
su / sudo | 切换用户 / 提权执行 | su - deploy、sudo -u www-data ls |
chown / chgrp | 改文件属主 / 属组 | chown -R deploy:deploy /data/app |
who / w / last | 查看登录情况 | w、last -n 10 |
三、高频工作场景
1. 新建一个部署账号
sudo useradd -m -s /bin/bash deploy ## -m 创建家目录,-s 指定登录 shell
sudo passwd deploy ## 交互式设置密码
useradd是底层命令,默认不建家目录、shell 可能是/bin/sh,所以-m -s基本必加。 Debian/Ubuntu 上还有交互式封装adduser deploy,按提示操作即可。
2. 把用户加入组(追加,别漏 -a)
sudo usermod -aG docker deploy
groups deploy ## 确认是否加入成功
注意:
usermod -G不加-a会覆盖用户原有的所有附加组,是非常常见的误操作。
3. 授予 sudo 权限
sudo usermod -aG sudo deploy
更精细的控制用 visudo 编辑 /etc/sudoers(不要直接 vim 改,改错会锁死 sudo)。
4. 查看和切换身份
whoami ## 我是谁
id ## 我的 UID、主组、所有附加组
sudo -l ## 我能执行哪些 sudo 命令
su - deploy ## 切换用户并加载其环境(推荐)
sudo -u www-data bash ## 以某个用户身份执行命令
su -会重置环境变量并进入目标用户家目录;su(不带-)只是换身份,环境仍是原来的,容易出现路径/变量错乱。
5. 团队共享目录:按组授权
sudo groupadd devops
sudo usermod -aG devops deploy
sudo usermod -aG devops alice
sudo chgrp devops /data/app
sudo chmod 2770 /data/app ## 2 是 setgid,目录下新建文件自动继承 devops 组
6. 服务专用用户与文件归属
Nginx、MySQL 等服务通常以独立低权限用户运行,部署静态资源后要交还属主:
ps -o user,pid,cmd -C nginx ## 确认服务运行用户
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
7. 锁定 / 禁用账号(离职、临时停用)
sudo usermod -L deploy ## 锁定密码
sudo usermod -U deploy ## 解锁
sudo usermod -s /sbin/nologin deploy ## 禁止登录(保留账号给服务用)
8. 删除用户
sudo userdel -r deploy ## -r 同时删除家目录和邮件目录
删除前先确认没有进程在用它:
ps -u deploy。删除组的条件是它不能是任何用户的主组。
四、避坑要点
- 组变更要重新登录才生效,当前会话可以用
newgrp devops临时切换。 usermod -G记得配-a,否则覆盖附加组。- 修改
/etc/sudoers一律用visudo,它会做语法检查。 - 不要用 root 跑日常业务,遵循最小权限;服务用独立用户。
- 生产环境删除用户前,先停服务、确认文件归属,避免误删导致服务起不来。
五、易错点辨析
这一节是自查用,记录实际练习中最容易混淆的点。
1. id 里的 gid 和 groups 不是一回事
uid=1002(alice) gid=1002(alice) groups=1002(alice),1003(devops)
gid=是主组,有且只有一个groups=是主组 + 附加组,不是“附加组列表”,主组排在最前面
2. 改用户的主组用 usermod -g,不是 chgrp
sudo usermod -g devops alice ## 对:改用户主组,附加组不受影响
sudo chgrp devops /data/share ## 这是改“文件的属组”,和用户无关
3. -g 和 -G 是两个方向:-g 动主组,-G 动附加组,互不影响;用 -G 追加必须带 -a。
4. 组变更对“已登录的会话”不生效
进程在登录时拿到一份组凭证快照,之后改 /etc/group 不会回头更新它。所以刚把用户移出组,当前会话仍然带着旧组权限。
- 让改动生效:退出重新登录(或
su - 用户名新开一个会话) newgrp 组名适合“新增组后立即使用”,移除组还是重新登录最稳妥
5. 新建文件的属组 = 用户当前的主组,除非所在目录设了 setgid(2770),此时继承目录的属组。
6. 删除组的前提:该组不能是任何用户的主组;组里还有成员时,建议先把成员移出再删。
7. userdel 不带 -r 只删账号,家目录会留下;要一起清理用 userdel -r。