权限管理

用户和组的关系

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 调整。