最近组里服务器重装系统,从CentOS7重装为了Ubuntu22.04LTS,对于原先的一些用户与组进行了重新配置,之前整理了一下文件权限相关的一些知识,现在整理出来了用户与组的相关知识。
一、用户与组是什么?
Linux 是多用户系统,每个进程都以某个用户的身份运行。用户与组是权限管理的基础:文件属于某个用户和某个组,其他用户能否访问取决于权限设置。对我而言,掌握用户和组的增删改查,是管理服务器、分配权限、排查“Permission denied”的前提。
用户信息存储在 /etc/passwd(不含密码),密码哈希存在 /etc/shadow;组信息在 /etc/group 和 /etc/gshadow。直接编辑这些文件也可以管理用户,但推荐用专用命令,避免格式错误。
二、用户管理
1. 创建用户
推荐使用 adduser(交互式,自动创建家目录、设置 shell、复制 /etc/skel 配置):
sudo adduser <username>
如果使用 useradd(底层命令,需要手动指定很多选项),一般用 adduser 更省心。
2. 查看用户信息
id <username>
输出示例:
uid=1001(alice) gid=1001(alice) groups=1001(alice),1002(devops)
常用选项:
id -u:只显示 UIDid -g:只显示主组 GIDid -G:显示所有所属组的 GIDid -nG:显示所有所属组的名称
3. 删除用户
# 仅禁用账号(保留家目录和邮件池)
sudo deluser <username>
# 连家目录和邮件池一起删除
sudo deluser --remove-home <username>
# 同时删除家目录和邮件池,以及所有相关文件(谨慎)
sudo deluser --remove-all-files <username>
注意:
deluser是 Debian/Ubuntu 系命令。CentOS/RHEL 使用userdel,参数为-r表示删除家目录。
4. 修改用户密码
# root 修改任意用户密码
sudo passwd <username>
# 普通用户修改自己的密码
passwd
5. 修改用户属性
常用 usermod:
# 修改用户的主组
sudo usermod -g <groupname> <username>
# 追加用户到附加组(-aG 必须一起用,否则会覆盖原有附加组)
sudo usermod -aG <groupname> <username>
# 修改用户的登录 Shell
sudo usermod -s /bin/bash <username>
# 修改用户的家目录
sudo usermod -d /new/home <username>
# 锁定/解锁用户账号
sudo usermod -L <username> # 锁定
sudo usermod -U <username> # 解锁
三、组管理
1. 创建组
sudo groupadd <groupname>
# 指定 GID
sudo groupadd -g 2000 <groupname>
2. 修改组名
sudo groupmod -n <new_groupname> <old_groupname>
3. 删除组
sudo groupdel <groupname>
注意:如果组是某个用户的主组,则不能删除,需先修改用户的主组。
4. 添加用户到组
# 追加到附加组(推荐)
sudo usermod -aG <groupname> <username>
# 也可以使用 gpasswd
sudo gpasswd -a <username> <groupname>
5. 将用户从组中移除
sudo gpasswd -d <username> <groupname>
# 或者用 deluser(Debian 系)
sudo deluser <username> <groupname>
6. 查看用户的组信息
groups <username>
id <username>
7. 查看组信息
# 查看组内成员
getent group <groupname>
# 或者直接看文件
cat /etc/group | grep <groupname>
四、查看系统用户/组信息
1. 查看当前登录在线的用户
who # 显示登录用户、终端、登录时间
users # 只显示用户名(去重)
w # 更详细:负载、正在运行的命令
whoami # 显示当前有效用户
2. 查看所有用户
cat /etc/passwd
每行格式:用户名:密码占位符:UID:GID:描述:家目录:登录Shell
常用过滤:cat /etc/passwd | grep /bin/bash 查看可登录用户。
3. 查看所有组
cat /etc/group
五、与文件权限相关的用户/组命令(简要)
虽然文件权限本身不在本篇重点,但以下两个命令与用户/组直接相关,列出供参考:
# 修改文件属主(和属组)
sudo chown <new_owner> <file>
sudo chown <new_owner>:<new_group> <file>
sudo chown -R <owner>:<group> <directory> # 递归
# 仅修改文件属组
sudo chgrp <new_group> <file>
sudo chgrp -R <group> <directory>
详细的权限管理(chmod、ACL、setgid、umask)请参考我的另一篇笔记《Linux 文件权限学习笔记》。
六、综合案例:创建一个项目组并添加成员
需求:创建 webapp 组,添加用户 deploy 和 monitor 到该组,并设置共享目录 /srv/webapp 的属组为 webapp。
# 1. 创建组
sudo groupadd webapp
# 2. 创建用户并加入组
sudo adduser deploy
sudo usermod -aG webapp deploy
sudo adduser monitor
sudo usermod -aG webapp monitor
# 3. 创建共享目录并设置属组
sudo mkdir -p /srv/webapp
sudo chown root:webapp /srv/webapp
sudo chmod 2770 /srv/webapp # setgid + rwxrwx---
# 4. 验证
id deploy
groups deploy
ls -ld /srv/webapp
七、速查表
| 操作 | 命令 |
|---|---|
| 创建用户(交互) | sudo adduser <username> |
| 删除用户(保留家目录) | sudo deluser <username> |
| 删除用户(连家目录) | sudo deluser --remove-home <username> |
| 修改用户密码 | sudo passwd <username> |
| 修改自己的密码 | passwd |
| 查看用户信息 | id <username> |
| 创建组 | sudo groupadd <groupname> |
| 修改组名 | sudo groupmod -n <新名> <旧名> |
| 删除组 | sudo groupdel <groupname> |
| 添加用户到组 | sudo usermod -aG <group> <user> |
| 从组中移除用户 | sudo gpasswd -d <user> <group> |
| 查看用户的组 | groups <user> 或 id <user> |
| 查看组内成员 | getent group <groupname> |
| 查看在线用户 | who、w、users |
| 查看所有用户 | cat /etc/passwd |
| 查看所有组 | cat /etc/group |
| 修改文件属主 | sudo chown <user> <file> |
| 修改文件属组 | sudo chgrp <group> <file> |
八、个人经验总结
adduservsuseradd:在 Debian/Ubuntu 上优先用adduser,它会自动处理家目录、shell、复制/etc/skel。CentOS 上习惯用useradd加-m参数。usermod -aG容易踩坑:忘记-a会覆盖原有附加组,导致用户丢失权限。务必写-aG。- 删除用户前检查:确认用户没有正在运行的进程,否则可以用
sudo pkill -u <username>先杀掉。 - 查看用户属于哪些组:
id比groups更详细,还能看 UID、GID、SELinux 上下文等。 - 组名不要轻易修改:修改组名后,文件上记录的属组还是旧的 GID(数字),用
find / -gid <old_gid>查找并更新。