权限管理
用户和组的关系
1.组是用户的集合载体
组的核心作用是批量管理多个用户,避免对单个用户逐一配置权限的繁琐操作。
一个组可以包含多个用户,这些用户会继承该组的权限和属性。
比如在操作系统(Windows/Linux)中,创建一个 “设计部” 组,将所有设计师用户加入该组,然后给 “设计部” 组分配访问设计文件服务器的权限,组内所有用户就自动获得了这个权限。
2.用户可以属于多个组
一个用户并非只能加入一个组,而是可以根据需求同时隶属于多个不同的组,并拥有所有所属组的权限合集。
例如:用户 “张三” 既是 “研发部” 组的成员(拥有代码库访问权限),又是 “项目 A” 组的成员(拥有项目 A 文档的编辑权限),那么张三就同时具备这两项权限。
3.权限与策略的继承逻辑
正向继承:用户默认拥有所属组的全部权限,组权限变更时,组内所有用户的权限会同步变更。
优先级区分:如果用户自身的权限和所属组的权限冲突,通常遵循 “权限从严” 或 “用户个人权限优先” 的规则,具体取决于系统的配置(比如 Linux 的权限模型中,用户个人权限会覆盖组权限)。
4.典型应用场景
操作系统权限管理:Windows 的本地用户组(如 Administrators、Users)、Linux 的用户组(通过/etc/group配置)。
协作平台成员管理:企业微信 / 钉钉的部门组、GitLab 的项目组,用于管控成员对项目、文档的访问范围。
网络资源分配:路由器、防火墙中,通过用户组划分不同的网络访问策略。
用户的配置文件:
/etc/passwd #新创建的用户,信息会追加到这个文件结尾
/etc/group #存放用户组的信息
/etc/shadow #用户加密后的密码
常用解释器
1.Bash(Bourne-Again Shell)
核心地位:绝大多数 Linux 发行版的默认 Shell(如 CentOS、Ubuntu、Debian),是目前使用最广泛的版本。
核心特点:兼容传统的 Bourne Shell(sh),支持命令历史记录、命令补全(Tab 键)、别名定义(alias)、管道(|)、重定向(>/>>)、脚本编程等功能,兼顾交互性和脚本执行能力。
常用操作
查看当前 Shell:echo $SHELL
临时切换到 Bash:bash
查看 Bash 版本:bash --version
2.Sh(Bourne Shell)
历史地位:Unix 系统的经典 Shell,也是很多后续 Shell 的基础。
核心特点:语法简洁,主要面向脚本执行,交互性较弱。在现代 Linux 中,sh 通常是 bash 或 dash 的软链接(可以用 ls -l /bin/sh 查看)。
适用场景:执行一些老旧的、兼容性要求高的 Shell 脚本。
3.Zsh(Z Shell)
核心特点:功能比 Bash 更强大,是开发者的热门选择。支持智能补全(路径、命令、参数甚至命令选项都能补全)、主题自定义、插件扩展(如搭配 oh-my-zsh 框架),语法与 Bash 高度兼容。
优势:个性化程度高,能大幅提升命令行操作效率;缺点是默认配置复杂,通常需要借助 oh-my-zsh 简化配置。
常用操作
安装(Ubuntu):sudo apt install zsh
设置为默认 Shell:chsh -s /bin/zsh
4.Fish(Friendly Interactive Shell)
核心特点:主打 “友好交互”,对新手极其友好。不需要复杂配置就能实现自动语法高亮、命令智能建议、自动补全,语法比 Bash 更直观。
缺点:与 Bash 脚本的兼容性略差,部分 Bash 脚本可能需要修改才能运行。
适用场景:追求简洁易用的普通用户,而非需要编写大量兼容脚本的运维人员。
5.Fish(Friendly Interactive Shell)
核心特点:主打 “友好交互”,对新手极其友好。不需要复杂配置就能实现自动语法高亮、命令智能建议、自动补全,语法比 Bash 更直观。
缺点:与 Bash 脚本的兼容性略差,部分 Bash 脚本可能需要修改才能运行。
适用场景:追求简洁易用的普通用户,而非需要编写大量兼容脚本的运维人员。
useradd - 创建用户
基本语法
基本语法
useradd [选项] 用户名
核心选项
选项 作用 示例
选项-u 指定用户 UID(唯一标识,0 为 root,1-999 为系统用户,1000 + 为普通用户) useradd -u 1005 test
选项-g 指定用户主组(可填组名或 GID) useradd -g dev test(加入 dev 组)
选项-G 指定用户附加组(多个组用逗号分隔) useradd -G dev,ops test
选项-d 指定用户家目录(默认 /home/用户名) useradd -d /data/test test
选项-s 指定用户默认 Shell(如 /bin/bash、/sbin/nologin) useradd -s /sbin/nologin test(禁止登录)
选项-m 自动创建用户家目录(默认普通用户会创建,系统用户不创建) useradd -m test
选项-M 不自动创建用户家目录
选项-r 创建系统用户(无家目录、UID<1000) useradd -r nginx(用于运行服务)
选项-c 添加用户注释(如用户描述、邮箱) useradd -c "test user,test@xxx.com" test
选项-e 指定账号过期日期(格式:YYYY-MM-DD) useradd -e 2025-12-31 test
常用实操案例
1.创建普通用户(默认配置)
useradd tom
默认行为:
主组:自动创建同名组 tom(GID 与 UID 一致);
家目录:/home/tom;
Shell:/bin/bash(取决于系统默认配置);
需手动设置密码:passwd tom(否则无法登录)。
2. 创建带自定义属性的用户
useradd -u 1008 -g dev -G ops -d /data/jerry -s /bin/bash -c "Jerry Dev" jerry
说明:
UID=1008,主组 = dev,附加组 = ops;
家目录 =/data/jerry,Shell=/bin/bash,注释 = Jerry Dev。
3.创建系统用户(用于运行服务)
useradd -r -s /sbin/nologin nginx
说明:
无家目录,无法登录系统,仅用于运行 nginx 服务,提升安全性。
4.创建无登录权限的普通用户
useradd -s /sbin/nologin testuser
说明:用户存在但无法通过 SSH / 终端登录,可用于文件权限分配。
关键注意事项
密码设置:useradd 仅创建用户,不会自动设置密码,必须通过 passwd 用户名 手动设置,否则用户无法登录;
默认配置文件:useradd 的默认行为由 /etc/default/useradd 控制(可通过 useradd -D 查看默认配置);
用户信息存储:创建的用户信息会写入 /etc/passwd,密码哈希存储在 /etc/shadow,组信息在 /etc/group;
删除用户:若需删除用户,用 userdel 用户名,加 -r 可同时删除家目录:userdel -r tom;
区别 adduser:
useradd:原生命令,需手动指定选项,适合脚本 / 批量操作;
adduser:交互式脚本(Debian/Ubuntu 默认),引导式创建用户(自动设密码、家目录等)
创建用户流程
1.useradd chaoge
2.系统读取/etc/login.defs(用户定义文件),和'etc/default/useradd(用户默认配置文件)俩文件中定义的规则创建新用户
3.向/etc/passwd和/etc/group文件中添加用户和组信息,向/etc/shadow和/etc/gshadow中添加密码信息
4.根据/etc/default/useradd文件中配置的信息创建用户家目录5.把/etc/skel中所有的文件复制到新用户家目录中
/etc/login.defs
UID_MIN 普通用户最小 UID(系统用户 < 该值) 1000
UID_MAX 普通用户最大 UID 60000
SYS_UID_MIN 系统用户最小 UID 100
SYS_UID_MAX 系统用户最大 UID 999
GID_MIN 普通组最小 GID 1000
GID_MAX 普通组最大 GID 60000
SYS_GID_MIN 系统组最小 GID 100
SYS_GID_MAX 系统组最大 GID 999
etc/default/useradd
GROUP 用户默认主组(旧版规则,现代系统多为 users 或自动创建同名组) 100(users 组 GID) GROUP=100
HOME 用户家目录的根路径 /home HOME=/data/home(自定义家目录根)
INACTIVE 密码过期后,账号的 “非活动天数”(-1 表示禁用该功能) -1 INACTIVE=7(密码过期 7 天后锁定账号)
EXPIRE 账号默认过期日期(空表示永不过期,格式 YYYY-MM-DD) 空 EXPIRE=2025-12-31(新用户默认年底过期)
SHELL 用户默认登录 Shell /bin/bash(CentOS)
/bin/sh(Ubuntu) SHELL=/sbin/nologin(默认禁止登录)
SKEL 用户家目录的 “模板目录”(创建家目录时,会复制该目录下的文件到用户家目录) /etc/skel SKEL=/etc/skel-dev(自定义模板)
CREATE_MAIL_SPOOL 是否为用户创建邮件缓存目录(/var/spool/mail/用户名) yes CREATE_MAIL_SPOOL=no(不创建邮件目录)
usermod - 修改已有用户属性
基本语法
usermod [选项] 用户名
核心选项(按功能分类,附示例)
1.调整用户 ID(UID)
选项-u <UID> 修改用户的 UID(需确保 UID 未被占用)
usermod -u 1010 testuser
1. UID 需唯一;2. 修改后需手动调整用户已有文件的 UID(chown -R 1010:组名 /home/testuser)
######
2.调整用户所属组
选项-g <组名/GID> 修改用户主组(用户只能有一个主组)
usermod -g dev testuser
主组需已存在(groupadd dev),修改后用户新创建的文件默认归属该组
选项-G <组1,组2,...> 替换用户附加组(覆盖原有附加组)
usermod -G ops,hr testuser 多个组用逗号分隔,无空格
选项-aG <组1,组2,...> 追加附加组(保留原有附加组,最常用)
usermod -aG dev,ops testuser
必加 -a 否则会清空原有附加组,这是新手最易踩坑点
######
3.调整家目录 / 登录 Shell
选项-d <路径> 修改用户家目录(仅改配置,不移动文件)
usermod -d /data/testuser testuser
若需同时移动原有文件,加 -m:usermod -md /data/testuser testuser
选项-s <Shell路径> 修改默认登录 Shell
usermod -s /bin/zsh testuser(切换 zsh)
usermod -s /sbin/nologin testuser(禁止登录)
Shell 需存在于 /etc/shells 中(cat /etc/shells 查看可用 Shell)
######
4.调整账号状态(安全相关)
选项-L 锁定用户账号(禁止登录,密码栏加 !)
usermod -L testuser 临时禁用用户,不删除账号
选项-U 解锁用户账号(解除锁定)
usermod -U testuser 恢复被锁定的用户
选项-e <日期> 设置账号过期日期(格式 YYYY-MM-DD)
usermod -e 2025-12-31 testuser 临时用户(如实习生)到期自动失效
选项-f <天数> 密码过期后,账号非活动天数(-1 = 禁用)
usermod -f 7 testuser 密码过期 7 天后,账号自动锁定
######
5.其他辅助选项
选项-c <注释> 修改用户注释(如姓名、邮箱)
usermod -c "Test User <test@xxx.com>" testuser 注释会写入 /etc/passwd 第 5 字段
选项-l <新用户名> 修改用户名(仅改名称,UID/GID/ 家目录不变)
usermod -l newtest testuser 建议同时修改家目录(-d /home/newtest)保持一致
选项-o 允许 UID 重复(慎用,破坏唯一性)
usermod -o -u 1000 testuser 仅特殊场景使用,可能导致权限混乱
高频实操案例
案例 1:给用户追加 sudo 权限(最常用)
bash
# 1. 将用户加入wheel组(CentOS/RHEL)或sudo组(Ubuntu/Debian)
# CentOS:
usermod -aG wheel testuser
# Ubuntu:
usermod -aG sudo testuser
# 2. 验证:切换用户后执行sudo命令
su - testuser
sudo ls /root # 输入testuser密码即可执行
######
案例 2:批量调整用户属性(脚本示例)
bash
# 给多个用户追加dev组,并禁止登录(适用于服务用户)
for user in nginx mysql redis; do
usermod -aG dev $user
usermod -s /sbin/nologin $user
done
######
案例 3:修改用户名 + 家目录 + 注释
bash
# 原用户:olduser → 新用户:newuser
usermod -l newuser -d /home/newuser -m -c "New User <new@xxx.com>" olduser
# 验证:
id newuser # 查看UID/GID是否不变,用户名已改
ls -ld /home/newuser # 家目录已移动
######
案例 4:临时锁定 / 解锁用户
bash
# 锁定用户(禁止登录)
usermod -L testuser
# 验证锁定:尝试登录会提示密码错误(即使密码正确)
su - testuser
# 解锁用户
usermod -U testuser
# 验证解锁
su - testuser
关键注意事项
生效时机:修改后的属性,对已登录的用户需退出重新登录才生效;对服务进程(如 nginx)需重启进程才能应用新用户权限。
文件权限同步:修改 UID/GID 后,需用 chown -R 新UID:新GID 用户家目录 同步已有文件的属主,否则用户可能无法访问自己的文件。
避免修改 root 用户:严禁用 usermod 修改 root(UID=0)的属性,可能导致系统无法登录。
锁定 vs 禁用 Shell:
-L:锁定密码(仍可通过 SSH 密钥 /sudo 登录);
-s /sbin/nologin:彻底禁止登录(包括密钥),适合服务用户。
配置文件验证:修改后可通过以下命令验证:
bash
id 用户名 # 查看UID/GID/所属组
cat /etc/passwd | grep 用户名 # 查看家目录/Shell/注释
chage -l 用户名 # 查看账号过期/密码策略
与其他命令的配合使用
需求 搭配命令 示例
修改用户密码 passwd passwd testuser
查看用户详细信息 id/finger id testuser、finger testuser
修改密码有效期 chage chage -M 90 testuser
删除用户 userdel userdel -r testuser(-r 删家目录)
userdel - 删除用户账户
基础语法
基础语法
userdel [选项] 用户名
核心选项
选项 全称/作用 示例
选项 -f --force :强制删除(即便用户处于登录状态,或家目录被其他进程占用) userdel -f testuser
选项 -r --remove :删除用户的同时,移除其家目录( /home/用户名 )和邮件池( /var/spool/mail/用户名 ) userdel -r testuser
选项 -h --help :查看命令帮助信息 userdel -h
选项 -Z --selinux-user :删除用户的SELinux映射(仅适用于开启SELinux的系统) userdel -Z testuser
groupadd - 创建用户组
基础语法
groupadd [选项] 组名
1.组名:需符合系统命名规范(字母/数字/下划线,不能以数字开头,长度不超32位)。
2.执行权限:仅 root用户 或通过 sudo 授权的用户可使用。
核心选项(常用6个
选项 全称/作用 示例
选项 -g GID --gid :指定组的GID(组ID,唯一标识),默认从 /etc/login.defs 自动分配 groupadd -g 1008 dev_group (创建GID=1008的dev_group组)
选项 -r --system :创建 系统组(GID通常小于1000,用于系统服务) groupadd -r nginx (创建nginx系统组,供nginx服务使用)
选项 -K KEY=VAL --key :覆盖 /etc/login.defs 中的默认配置(如GID范围) groupadd -K GID_MIN=2000 test (强制GID从2000开始分配)
选项 -o --non-unique :允许创建GID重复的组(需配合 -g 使用,慎用) groupadd -o -g 1008 dev_group2 (GID=1008与dev_group重复)
选项 -f --force :强制创建(若组已存在,不报错;若结合 -r ,可覆盖系统组) groupadd -f dev_group (组已存在时不报错,直接退出)
选项 -h --help :查看命令帮助(显示所有选项说明) groupadd -h
关键文件(组信息存储位置)
创建组后,系统会更新两个核心文件:
1. /etc/group :存储所有组的基本信息(组名:密码占位符:GID:组内用户列表)。
示例行: dev_group:x:1008:user1,user2 (组dev_group,GID=1008,包含用户user1、user2)。
2. /etc/gshadow :存储组的加密密码(若设置组密码,用于组管理员授权)。
典型用法示例
1. 创建普通组(自动分配GID):
bash
groupadd test_group # 创建名为test_group的普通组
2. 创建指定GID的系统组:
bash
groupadd -r -g 999 mysql # 创建系统组mysql,GID=999(供MySQL服务使用)
3. 强制创建(忽略已存在的组):
bash
groupadd -f -g 1010 dev # 若dev组已存在,不报错;不存在则创建GID=1010的dev组
groupmod - 修改组配置
基础语法
1. 基础语法
groupmod [选项] 旧组名
核心选项(常用5个)
选项 全称/作用 示例
选项 -g 新GID --gid :修改组的GID(需唯一,除非加 -o ) groupmod -g 1010 dev_group (将dev_group的GID改为1010)
选项 -n 新组名 --new-name :修改组名(旧组名→新组名,组内用户成员不变) groupmod -n dev_team dev_group (将dev_group改名为dev_team)
选项 -o --non-unique :允许GID重复(需配合 -g 使用,慎用,可能导致权限混乱) groupmod -o -g 1010 test_group (让test_group的GID=1010,与dev_group重复)
选项 -K KEY=VAL --key :临时覆盖 /etc/login.defs 中的默认配置(如GID范围) groupmod -K GID_MAX=5000 dev_group (修改时强制GID不超过5000)
选项 -h --help :查看命令帮助 groupmod -h
典型用法
修改组GID: groupmod -g 1015 test_group
同时改组名和GID: groupmod -n new_test -g 1020 old_test
允许GID重复(特殊场景): groupmod -o -g 1015 test_group2
注意事项
若组内有用户,修改GID后,用户家目录/文件的组权限会自动关联新GID,无需手动调整。
系统组(如 nginx )修改GID前,需先停止对应服务,避免权限异常。
groupdel - 删除用户组
核心作用:彻底删除无用的用户组,仅能删除“空组”(无用户以该组为主组)。
基础语法
groupdel [组名]
(无复杂选项,仅需指定要删除的组名
典型用法
删除普通空组: groupdel test_group
删除系统空组(慎用): groupdel nginx (需确保nginx服务已卸载,且无用户依赖该组)
关键限制(删除失败的3种常见原因)
1. 组是用户的主组:若有用户以该组为主组( /etc/passwd 第4列是该组GID),需先将用户主组改为其他组( usermod -g 新主组 用户名 ),再删除。
示例: usermod -g users testuser → groupdel test_group
2. 组内有附加组用户:若组是用户的附加组,直接删除不影响用户(仅从组内移除用户),无需手动清理。
3. 组不存在或权限不足:确保组名正确,且以root身份执行
注意事项
删除组后, /etc/group 和 /etc/gshadow 中该组的记录会被彻底移除。
若组关联了文件/目录的权限,删除组后,文件的组权限会显示为原GID(而非组名),需手动用 chgrp 调整。