Linux复习-用户和组管理

在 Linux 系统中,用户与组管理 是系统安全与权限控制的基石。合理的用户与组配置,既能实现多用户环境下的资源隔离,又能通过权限分配保障系统安全。本文将围绕用户与组的创建、删除、管理核心命令(useraddgroupaddpasswd等)展开,从基础语法到实战场景,全面讲解 Linux 用户与组管理的核心知识。

一、Linux 用户与组的核心概念

1. 用户(User)

Linux 用户是系统的操作主体,每个用户拥有唯一的UID(用户 ID),系统通过 UID 识别用户身份。用户分为三类:

  • 超级用户(root):UID 为 0,拥有系统最高权限,可执行所有操作。
  • 系统用户 :UID 通常为 1~999(不同发行版略有差异),用于运行系统服务(如nginxmysql),无登录权限。
  • 普通用户:UID 从 1000 开始,由管理员创建,用于日常操作,权限受限制。

2. 用户组(Group)

用户组是多个用户的集合,通过 **GID(组 ID)** 标识,用于简化权限管理(如为一组用户分配相同的文件访问权限)。每个用户至少属于一个主组,可附加多个附属组。

  • 主组(Primary Group):用户创建文件时,文件默认归属的组,每个用户唯一。
  • 附属组(Supplementary Group):用户额外加入的组,用于扩展权限,一个用户可加入多个。

3. 核心配置文件

用户与组的信息存储在以下核心文件中,是管理的基础:

  • /etc/passwd:存储用户基本信息(用户名、UID、GID、家目录、Shell 等)。
  • /etc/shadow:存储用户密码(加密后)、密码有效期等安全信息(仅 root 可读取)。
  • /etc/group:存储用户组基本信息(组名、GID、组内用户列表)。
  • /etc/gshadow:存储用户组密码(加密后)、组管理员等信息(仅 root 可读取)。

二、用户管理核心命令实战

1. useradd:创建用户

useradd是创建用户的核心命令,支持自定义 UID、家目录、Shell、附属组等参数。

常用参数
  • -u:指定用户 UID(需唯一,未指定则系统自动分配)。
  • -g:指定用户主组(需已存在的组名 / GID)。
  • -G:指定用户附属组(多个组用逗号分隔)。
  • -d:指定用户家目录(默认/home/用户名)。
  • -s:指定用户登录 Shell(如/bin/bash/sbin/nologin,后者禁止登录)。
  • -m:自动创建家目录(若家目录不存在)。
  • -c:添加用户注释(如用户姓名、备注)。
实战示例
bash 复制代码
# 1. 创建普通用户test,默认配置(主组为test,家目录/home/test,Shell为/bin/bash)
useradd test

# 2. 创建用户admin,指定UID=1001,主组为root,附属组为wheel,家目录/opt/admin,注释"系统管理员"
useradd -u 1001 -g root -G wheel -d /opt/admin -c "系统管理员" admin

# 3. 创建系统用户nginx,禁止登录(用于运行Nginx服务),不创建家目录
useradd -r -s /sbin/nologin nginx

2. passwd:设置 / 修改用户密码

passwd用于为用户设置密码、修改密码,或配置密码有效期(仅 root 可操作其他用户密码)。

常用参数
  • 无参数:修改当前用户密码。
  • 用户名:root 用户为指定用户设置 / 修改密码。
  • -l:锁定用户(禁止登录)。
  • -u:解锁用户。
  • -d:删除用户密码(允许无密码登录,不安全)。
  • -S:查看用户密码状态(是否锁定、密码有效期等)。
实战示例
bash 复制代码
# 1. root用户为test用户设置密码(输入两次密码,无回显)
passwd test

# 2. 锁定test用户(禁止登录)
passwd -l test

# 3. 解锁test用户
passwd -u test

# 4. 查看test用户密码状态
passwd -S test

3. usermod:修改用户信息

usermod用于修改已创建用户的属性(UID、主组、附属组、家目录、Shell 等)。

常用参数
  • -u:修改用户 UID。
  • -g:修改用户主组。
  • -G:修改用户附属组(覆盖原有附属组,需保留原有组需一并列出)。
  • -aG:追加附属组(不覆盖原有组,推荐使用)。
  • -d:修改用户家目录(需配合-m移动原有家目录数据)。
  • -s:修改用户登录 Shell。
  • -l:修改用户名。
  • -L:锁定用户(同passwd -l)。
  • -U:解锁用户(同passwd -u)。
实战示例
bash 复制代码
# 1. 将test用户的UID修改为1002
usermod -u 1002 test

# 2. 为test用户追加附属组wheel(不覆盖原有附属组)
usermod -aG wheel test

# 3. 将test用户的家目录修改为/opt/test,并移动原有数据
usermod -d /opt/test -m test

# 4. 将test用户的Shell修改为/sbin/nologin(禁止登录)
usermod -s /sbin/nologin test

# 5. 将test用户的用户名修改为test_new
usermod -l test_new test

4. userdel:删除用户

userdel用于删除系统中的用户,可选择是否删除用户家目录和邮件池。

常用参数
  • -r:删除用户的同时,删除其家目录和邮件池(推荐使用,避免残留文件)。
  • 无参数:仅删除用户,保留家目录和邮件池。
实战示例
bash 复制代码
# 1. 删除test用户,保留家目录和邮件池
userdel test

# 2. 删除test_new用户,同时删除其家目录和邮件池
userdel -r test_new

三、用户组管理核心命令实战

1. groupadd:创建用户组

groupadd用于创建新的用户组,支持自定义 GID。

常用参数
  • -g:指定组 GID(需唯一,未指定则系统自动分配)。
  • -r:创建系统组(GID 通常为 1~999)。
实战示例
bash 复制代码
# 1. 创建普通组dev,GID自动分配
groupadd dev

# 2. 创建系统组web,指定GID=888
groupadd -r -g 888 web

2. groupmod:修改用户组信息

groupmod用于修改已创建组的属性(GID、组名)。

常用参数
  • -g:修改组 GID。
  • -n:修改组名。
实战示例
bash 复制代码
# 1. 将dev组的GID修改为1001
groupmod -g 1001 dev

# 2. 将dev组的组名修改为develop
groupmod -n develop dev

3. groupdel:删除用户组

groupdel用于删除系统中的用户组,需确保组内无用户(或用户已切换主组),否则无法删除。

实战示例
bash 复制代码
# 删除develop组
groupdel develop

4. gpasswd:管理组密码与成员

gpasswd用于设置组密码、添加 / 删除组内成员、指定组管理员。

常用参数
  • -a:向组中添加用户(追加成员)。
  • -d:从组中删除用户。
  • -A:指定组管理员(可管理组内成员)。
  • -r:删除组密码。
  • -R:限制组登录(仅组内成员可通过newgrp切换到该组)。
实战示例
bash 复制代码
# 1. 向web组中添加test用户
gpasswd -a test web

# 2. 从web组中删除test用户
gpasswd -d test web

# 3. 指定admin为web组的管理员
gpasswd -A admin web

# 4. 为web组设置密码(用户可通过newgrp web切换到该组,需输入密码)
gpasswd web

四、用户与组管理实战场景

场景 1:创建开发团队用户与组

需求:创建dev组,添加 3 名开发用户(dev1、dev2、dev3),均属于dev主组,且可访问/data/dev目录。

bash 复制代码
# 1. 创建dev组
groupadd dev

# 2. 创建3名开发用户,主组为dev,家目录/home/dev[1-3]
useradd -g dev dev1
useradd -g dev dev2
useradd -g dev dev3

# 3. 为3名用户设置密码
passwd dev1
passwd dev2
passwd dev3

# 4. 创建开发目录并分配权限
mkdir -p /data/dev
chown :dev /data/dev  # 归属dev组
chmod 775 /data/dev   # 组内用户可读写执行,其他用户仅读执行

场景 2:限制系统服务用户登录

需求:创建mysql系统用户,用于运行 MySQL 服务,禁止登录,不创建家目录。

bash 复制代码
# 创建mysql系统用户,Shell为/sbin/nologin(禁止登录)
useradd -r -s /sbin/nologin mysql

# 验证用户信息(查看Shell是否为/sbin/nologin)
grep mysql /etc/passwd

场景 3:批量添加用户(脚本实现)

需求:批量创建 10 名用户(user1~user10),主组为users,密码统一为123456

bash 复制代码
#!/bin/bash
# 批量创建用户脚本
groupadd -r users  # 创建系统组users
for i in {1..10}; do
    useradd -g users user$i  # 创建用户,主组为users
    echo "123456" | passwd --stdin user$i  # 非交互设置密码(CentOS/RHEL)
    # Ubuntu/Debian系统需替换为:echo "user$i:123456" | chpasswd
done

场景 4:清理僵尸用户与组

需求:删除离职员工用户old_user,并清理其残留的组与文件。

bash 复制代码
# 1. 查看用户所属组
id old_user

# 2. 删除用户并清理家目录
userdel -r old_user

# 3. 若用户主组无其他成员,删除该组
groupdel old_user_group  # 替换为实际组名

五、核心命令速查与注意事项

1. 核心命令速查表

命令 作用 核心参数示例
useradd 创建用户 useradd -g dev -G wheel test
passwd 设置 / 修改密码 passwd testpasswd -l test
usermod 修改用户信息 usermod -aG wheel test
userdel 删除用户 userdel -r test
groupadd 创建组 groupadd dev
groupmod 修改组信息 groupmod -n develop dev
groupdel 删除组 groupdel develop
gpasswd 管理组成员 / 密码 gpasswd -a test dev

2. 关键注意事项

  • 权限原则:普通用户仅能管理自身密码,用户与组的创建、删除、修改需 root 权限。
  • UID/GID 唯一性:创建用户 / 组时,UID、GID 必须唯一,避免冲突。
  • 主组与附属组 :修改用户附属组时,优先使用-aG(追加)而非-G(覆盖),防止丢失原有权限。
  • 安全规范 :禁止为普通用户分配 root 权限(如直接修改 UID 为 0);系统服务用户需设置/sbin/nologin,禁止登录;密码需符合复杂度要求,避免弱密码。
  • 残留清理 :删除用户时,使用userdel -r清理家目录与邮件池,避免磁盘空间浪费;删除组前需确认组内无用户。
相关推荐
lead520lyq2 小时前
Golang GPRC流式传输案例
服务器·开发语言·golang
饺子大魔王的男人2 小时前
告别服务器失联!Prometheus+Alertmanager+cpolar 让监控告警不局限于内网
运维·服务器·prometheus
吉普赛的歌2 小时前
【服务器】为安全考虑,已锁定该用户帐户,原因是登录尝试或密码更。改尝试过多。请稍候片刻再重试,或与系统管理员或技术支持联系。
运维·服务器·安全
m0_737302582 小时前
腾讯云TDSQL-C+CVM软硬协同,数据库性能三倍跃升
服务器
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.2 小时前
Keepalived高可用配置指南
服务器·网络·php
掘根2 小时前
【jsonRpc项目】Registry-Discovery模块
运维·服务器·数据库
图扑可视化2 小时前
HT 技术实现数字孪生智慧服务器信息安全监控平台
服务器·信息可视化·数字孪生·三维可视化
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][dma]dma-buf
linux·笔记·学习
j_xxx404_2 小时前
Linux:进程优先级与进程切换与调度
linux·运维·服务器