最近组里服务器重装系统,从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:只显示 UID
  • id -g:只显示主组 GID
  • id -G:显示所有所属组的 GID
  • id -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 组,添加用户 deploymonitor 到该组,并设置共享目录 /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>
查看在线用户whowusers
查看所有用户cat /etc/passwd
查看所有组cat /etc/group
修改文件属主sudo chown <user> <file>
修改文件属组sudo chgrp <group> <file>

八、个人经验总结

  1. adduser vs useradd:在 Debian/Ubuntu 上优先用 adduser,它会自动处理家目录、shell、复制 /etc/skel。CentOS 上习惯用 useradd-m 参数。
  2. usermod -aG 容易踩坑:忘记 -a覆盖原有附加组,导致用户丢失权限。务必写 -aG
  3. 删除用户前检查:确认用户没有正在运行的进程,否则可以用 sudo pkill -u <username> 先杀掉。
  4. 查看用户属于哪些组idgroups 更详细,还能看 UID、GID、SELinux 上下文等。
  5. 组名不要轻易修改:修改组名后,文件上记录的属组还是旧的 GID(数字),用 find / -gid <old_gid> 查找并更新。

作者

884705373@qq.com

相关文章

QLoRA微调原理详解:与LoRA的性能与内存对比

引言:为什么大模型微调需要QLoRA? 在深...

读出全部

关于Norm的解析

可以说,如果没有残差连接和 Layer No...

读出全部

从 SGD 到 AdamW 的优化器

写在前面 在上一篇文章中,我们讨论了如何用数...

读出全部