Skip to main content

用户和用户组

一、核心概念​

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。删除组的条件是它不能是任何用户的主组。

四、避坑要点​

  1. 组变更要重新登录才生效,当前会话可以用 newgrp devops 临时切换。
  2. usermod -G 记得配 -a,否则覆盖附加组。
  3. 修改 /etc/sudoers 一律用 visudo,它会做语法检查。
  4. 不要用 root 跑日常业务,遵循最小权限;服务用独立用户。
  5. 生产环境删除用户前,先停服务、确认文件归属,避免误删导致服务起不来。

五、易错点辨析​

这一节是自查用,记录实际练习中最容易混淆的点。

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。