Linux 用户权限 7 大核心命令脑图详解(含排错口诀)
💡 文章亮点:一文掌握Linux权限管理全套技能,从基础到进阶,从理论到实战!
📚 建议收藏:本文长期更新,建议点赞收藏,需要时快速查阅!
📑 目录导航
- [第一章:用户管理基础 - useradd与usermod](#第一章:用户管理基础 - useradd与usermod "#%E7%AC%AC%E4%B8%80%E7%AB%A0%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80---useradd%E4%B8%8Eusermod")
- [第二章:默认权限掌控 - umask与setfacl](#第二章:默认权限掌控 - umask与setfacl "#%E7%AC%AC%E4%BA%8C%E7%AB%A0%E9%BB%98%E8%AE%A4%E6%9D%83%E9%99%90%E6%8E%8C%E6%8E%A7---umask%E4%B8%8Esetfacl")
- [第三章:高级权限管理 - chmod特殊权限、chown与chage](#第三章:高级权限管理 - chmod特殊权限、chown与chage "#%E7%AC%AC%E4%B8%89%E7%AB%A0%E9%AB%98%E7%BA%A7%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86---chmod%E7%89%B9%E6%AE%8A%E6%9D%83%E9%99%90chown%E4%B8%8Echage")
- 第四章:权限管理实战案例
- 第五章:Linux权限管理脑图
第一章:用户管理基础 - useradd与usermod
1.1 useradd命令详解
🔍 核心功能:创建新用户账户,是Linux系统管理员必备技能
1.1.1 常用选项速查表
选项 | 功能 | 实用指数 |
---|---|---|
-b, --base-dir BASE_DIR |
指定新用户主目录的基目录 | ⭐⭐ |
-c, --comment COMMENT |
添加用户的描述或注释(存储在/etc/passwd的备注栏) | ⭐⭐⭐ |
-d, --home-dir HOME_DIR |
指定用户的主目录路径 | ⭐⭐⭐⭐ |
-D, --defaults |
显示或修改默认的useradd配置 | ⭐⭐ |
-e, --expiredate EXPIRE_DATE |
设置用户账户的过期日期(格式:YYYY-MM-DD) | ⭐⭐⭐ |
-f, --inactive INACTIVE |
设置密码过期后的宽限期天数 | ⭐⭐ |
-g, --gid GROUP |
指定用户的主组(组名或GID) | ⭐⭐⭐⭐ |
-G, --groups GROUPS |
指定用户的附加组(多个组用逗号分隔) | ⭐⭐⭐⭐⭐ |
-m, --create-home |
自动创建用户的主目录 | ⭐⭐⭐⭐⭐ |
-M, --no-create-home |
不创建用户的主目录 | ⭐⭐ |
-s, --shell SHELL |
指定用户的登录Shell | ⭐⭐⭐⭐ |
-u, --uid UID |
指定用户的UID | ⭐⭐⭐ |
🧠 记忆口诀:「创用户,记CGSM」 - Comment描述、Group组别、Shell终端、Make主目录
1.1.2 常见使用场景
🔹 基础用户创建
bash
# 创建基本用户(自动创建主目录)
sudo useradd -m testuser
# 创建用户并设置密码(一步到位)
sudo useradd -m testuser && sudo passwd testuser
🔹 创建特定配置用户
bash
# 创建开发人员账户(指定主目录、组、Shell)
sudo useradd -m -d /home/developers/alice -g developers -G docker,sudo -s /bin/bash -c "开发工程师" alice
# 创建临时账户(设置过期时间)
sudo useradd -m -e 2023-12-31 -c "临时访客" tempuser
🔹 创建系统服务账户
bash
# 创建系统用户(无主目录、无登录Shell)
sudo useradd -r -s /sbin/nologin -c "Web服务账户" webservice
⚠️ 坑位预警:
- 创建用户后别忘记设置密码,否则账户无法登录
- 默认情况下,不加
-m
选项不会创建主目录- 系统用户和普通用户的UID范围不同,使用
-r
创建系统用户时会自动分配合适的UID
1.2 usermod命令:用户信息修改利器
🔍 核心功能:修改已存在用户的各种属性,是用户管理的瑞士军刀
1.2.1 常用选项速查表
选项 | 功能 | 实用指数 |
---|---|---|
-a, --append |
与-G一起使用,追加新组而不替换现有组 | ⭐⭐⭐⭐⭐ |
-c, --comment COMMENT |
修改用户的描述或注释 | ⭐⭐⭐ |
-d, --home HOME_DIR |
修改用户的主目录 | ⭐⭐⭐⭐ |
-e, --expiredate EXPIRE_DATE |
修改账户过期日期 | ⭐⭐⭐ |
-g, --gid GROUP |
修改用户的主组 | ⭐⭐⭐⭐ |
-G, --groups GROUPS |
修改用户的附加组(多个组用逗号分隔) | ⭐⭐⭐⭐⭐ |
-l, --login NEW_LOGIN |
修改用户名 | ⭐⭐⭐ |
-L, --lock |
锁定用户账户 | ⭐⭐⭐⭐ |
-m, --move-home |
与-d一起使用,移动用户文件到新主目录 | ⭐⭐⭐⭐ |
-s, --shell SHELL |
修改用户的登录Shell | ⭐⭐⭐⭐ |
-U, --unlock |
解锁用户账户 | ⭐⭐⭐⭐ |
🧠 记忆口诀:「改用户,记AGS」 - Append追加组、Group主组、Shell终端
1.2.2 常见使用场景
🔹 修改用户组
bash
# 添加用户到新的附加组(保留原有组)
sudo usermod -aG docker,sudo testuser
# 修改用户的主组
sudo usermod -g developers testuser
🔹 修改用户Shell和主目录
bash
# 修改用户的登录Shell
sudo usermod -s /bin/zsh testuser
# 修改用户的主目录并移动文件
sudo usermod -d /newhome/testuser -m testuser
🔹 账户安全管理
bash
# 锁定用户账户(临时禁用)
sudo usermod -L testuser
# 解锁用户账户
sudo usermod -U testuser
# 设置账户过期时间
sudo usermod -e 2023-12-31 testuser
⚠️ 坑位预警:
- 使用
-G
修改附加组时,不加-a
会替换所有现有附加组,而非追加- 修改主目录时,不加
-m
选项不会自动移动用户文件- 修改用户属性后,用户需要重新登录才能生效
第二章:默认权限掌控 - umask与setfacl
2.1 umask:默认权限掩码
🔍 核心功能:控制新建文件和目录的默认权限,是权限管理的基础设置
2.1.1 umask基本原理
umask值决定了新建文件和目录的默认权限:
- 目录默认权限 = 777 - umask
- 文件默认权限 = 666 - umask(文件默认无执行权限)
2.1.2 常用umask值及对应权限
umask值 | 目录权限 | 文件权限 | 安全级别 | 适用场景 |
---|---|---|---|---|
0022 | 755 (rwxr-xr-x) | 644 (rw-r--r--) | 中等 | 默认值,适合个人用户 |
0027 | 750 (rwxr-x---) | 640 (rw-r-----) | 较高 | 团队协作,限制其他用户访问 |
0077 | 700 (rwx------) | 600 (rw-------) | 最高 | 敏感数据,仅用户本人可访问 |
0002 | 775 (rwxrwxr-x) | 664 (rw-rw-r--) | 较低 | 协作环境,允许组内写入 |
2.1.3 umask使用示例
bash
# 查看当前umask值(数字格式)
umask
# 查看当前umask值(符号格式)
umask -S
# 临时设置umask值(当前会话有效)
umask 0027
# 永久设置umask(添加到~/.bashrc或/etc/profile)
echo "umask 0027" >> ~/.bashrc
🧠 记忆口诀:「umask取反算,目录777文件666」
⚠️ 坑位预警:
- umask只影响新建文件/目录,不影响已存在的文件/目录
- 不同用户可能有不同的默认umask值
- 文件权限计算时,即使umask允许执行权限,新文件默认也不会有执行权限
2.2 setfacl:访问控制列表
🔍 核心功能:提供比传统权限更精细的访问控制,可针对特定用户/组设置独立权限
2.2.1 ACL基本概念
ACL (Access Control List) 突破了传统"用户/组/其他人"三级权限的限制,允许为任意用户或组设置独立权限。
2.2.2 常用选项速查表
选项 | 功能 | 实用指数 |
---|---|---|
-m, --modify |
添加或修改ACL规则 | ⭐⭐⭐⭐⭐ |
-x, --remove |
删除指定ACL规则 | ⭐⭐⭐⭐ |
-b, --remove-all |
删除所有ACL规则 | ⭐⭐⭐ |
-R, --recursive |
递归操作(包括子目录和文件) | ⭐⭐⭐⭐⭐ |
-d, --default |
设置默认ACL(影响后续新建项) | ⭐⭐⭐⭐ |
2.2.3 ACL规则格式
ruby
[d[efault]:][u[ser]:|g[roup]:|o[ther]:|m[ask]:]name:permissions
u:用户名:权限
- 针对特定用户g:组名:权限
- 针对特定组d:u:用户名:权限
- 默认ACL,影响新建文件/目录
2.2.4 常见使用场景
🔹 为特定用户/组设置权限
bash
# 为用户alice添加读写权限
sudo setfacl -m u:alice:rw /shared/project.txt
# 为开发组添加读写执行权限
sudo setfacl -m g:developers:rwx /opt/app
🔹 递归设置权限
bash
# 递归为用户bob添加读写权限
sudo setfacl -Rm u:bob:rw /var/www/html
# 递归为组设置权限
sudo setfacl -Rm g:webadmin:rx /etc/nginx
🔹 设置默认ACL(权限继承)
bash
# 设置目录默认ACL,新建文件自动继承权限
sudo setfacl -dm u:alice:rw /shared/projects
# 同时设置当前和默认ACL
sudo setfacl -m u:alice:rwx,d:u:alice:rwx /shared/projects
🔹 查看和管理ACL
bash
# 查看文件/目录的ACL
getfacl /shared/project.txt
# 删除特定ACL规则
sudo setfacl -x u:bob /shared/project.txt
# 删除所有ACL规则
sudo setfacl -b /shared/project.txt
🧠 记忆口诀:「ACL精细控,u用户g组d默认」
⚠️ 坑位预警:
- 文件系统必须支持ACL(大多数现代文件系统默认支持)
- 复制文件时,ACL可能会丢失(使用
cp -p
保留权限)- 默认ACL只影响新建文件/目录,不影响已存在的文件/目录
- 如果ACL设置不生效,检查SELinux是否阻止了操作
第三章:高级权限管理 - chmod特殊权限、chown与chage
3.1 chmod特殊权限位
🔍 核心功能:设置特殊权限位(SUID/SGID/Sticky Bit),实现高级权限控制
3.1.1 特殊权限位详解
权限位 | 数字表示 | 符号表示 | 作用 | 典型应用 |
---|---|---|---|---|
SUID | 4 | u+s | 执行文件时临时获得文件所有者权限 | passwd, sudo |
SGID | 2 | g+s | 文件:执行时获得所属组权限 目录:新建文件继承目录组 | 共享目录 |
Sticky Bit | 1 | o+t | 只有文件所有者和root可删除文件 | /tmp目录 |
3.1.2 设置特殊权限位
bash
# 数字模式设置(推荐,更清晰)
chmod 4755 /path/to/file # 设置SUID
chmod 2755 /path/to/dir # 设置SGID
chmod 1777 /path/to/dir # 设置Sticky Bit
chmod 6755 /path/to/file # 同时设置SUID和SGID
# 符号模式设置
chmod u+s /path/to/file # 设置SUID
chmod g+s /path/to/dir # 设置SGID
chmod o+t /path/to/dir # 设置Sticky Bit
3.1.3 特殊权限应用场景
🔹 SUID应用场景
SUID主要用于允许普通用户临时获得文件所有者(通常是root)的权限执行特定操作:
bash
# 查看系统中的SUID程序
find / -perm -4000 -type f 2>/dev/null
# 常见SUID程序
ls -l /usr/bin/passwd # 允许普通用户修改自己的密码
ls -l /usr/bin/sudo # 允许授权用户执行root命令
🔹 SGID应用场景
SGID在目录上特别有用,用于团队协作:
bash
# 创建共享目录,设置SGID
mkdir /shared/project
chgrp developers /shared/project
chmod 2775 /shared/project # rwxrwsr-x
# 测试:新建文件自动继承目录组
touch /shared/project/test.txt
ls -l /shared/project/test.txt # 组应为developers
🔹 Sticky Bit应用场景
Sticky Bit用于共享目录,防止用户删除他人文件:
bash
# 设置公共临时目录
mkdir /public/temp
chmod 1777 /public/temp # rwxrwxrwt
# 系统中的典型应用
ls -ld /tmp # 应显示sticky bit (t)
🧠 记忆口诀:「特权421,S执行G继承T防删」
⚠️ 坑位预警:
- SUID只对二进制可执行文件有效,对脚本无效
- 随意设置SUID可能导致严重安全漏洞,尤其是给shell设置SUID
- SGID对目录和文件的作用不同,目录更常用
- 特殊权限位在ls -l输出中显示为s、S、t或T,小写表示同时有执行权限
3.2 chown:所有权管理
🔍 核心功能:修改文件/目录的所有者和所属组,是权限管理的基础操作
3.2.1 基本语法
bash
chown [选项] 用户[:组] 文件/目录
3.2.2 常用选项
选项 | 功能 | 实用指数 |
---|---|---|
-R, --recursive |
递归修改(包括子目录和文件) | ⭐⭐⭐⭐⭐ |
-h, --no-dereference |
修改符号链接本身而非目标 | ⭐⭐⭐ |
--from=当前用户:当前组 |
仅当当前所有者匹配时修改 | ⭐⭐ |
-v, --verbose |
显示详细操作信息 | ⭐⭐⭐ |
3.2.3 常见使用场景
🔹 修改文件所有者
bash
# 修改单个文件的所有者
sudo chown alice file.txt
# 同时修改所有者和所属组
sudo chown alice:developers file.txt
# 只修改所属组
sudo chown :developers file.txt
# 或使用chgrp命令
sudo chgrp developers file.txt
🔹 递归修改所有权
bash
# 递归修改目录及其内容的所有者和组
sudo chown -R webuser:www-data /var/www/html
# 有条件地递归修改
sudo chown -R --from=olduser:oldgroup newuser:newgroup /path
🧠 记忆口诀:「chown用户冒号组,-R递归一锅烩」
⚠️ 坑位预警:
- 只有root用户或文件所有者可以更改文件所有权
- 修改大型目录时,-R选项可能导致性能问题
- 修改符号链接时,默认修改链接目标而非链接本身
3.3 chage:密码策略管理
🔍 核心功能:管理用户密码的生命周期,增强系统安全性
3.3.1 基本语法
bash
chage [选项] 用户名
3.3.2 常用选项
选项 | 功能 | 实用指数 |
---|---|---|
-l |
显示用户的密码策略信息 | ⭐⭐⭐⭐⭐ |
-d 日期 |
设置上次密码更改日期 | ⭐⭐⭐ |
-E 日期 |
设置账户过期日期 | ⭐⭐⭐⭐ |
-I 天数 |
设置密码过期后账户被锁定前的宽限天数 | ⭐⭐⭐ |
-m 天数 |
设置密码更改之间的最小天数 | ⭐⭐⭐ |
-M 天数 |
设置密码的最大有效天数 | ⭐⭐⭐⭐⭐ |
-W 天数 |
设置密码过期前的警告天数 | ⭐⭐⭐⭐ |
3.3.3 常见使用场景
🔹 查看密码策略
bash
# 查看用户的密码策略
sudo chage -l username
输出示例:
yaml
最近一次密码修改时间 :8月 01, 2023
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
🔹 设置密码有效期
bash
# 设置密码90天后过期,提前7天警告
sudo chage -M 90 -W 7 username
# 强制用户下次登录时修改密码
sudo chage -d 0 username
# 设置账户过期日期
sudo chage -E 2023-12-31 username
🔹 锁定过期账户
bash
# 设置密码过期7天后锁定账户
sudo chage -I 7 username
# 立即使账户过期
sudo chage -E $(date +%Y-%m-%d) username
🧠 记忆口诀:「chage密码周期管,-M最长-m最短-W警告」
⚠️ 坑位预警:
- 修改密码策略不会影响已登录的用户会话
- 设置
-d 0
强制修改密码时,用户必须有权限修改密码- 日期格式必须是YYYY-MM-DD,否则可能导致意外结果
第四章:权限管理实战案例
4.1 案例一:构建安全的多用户开发环境
需求:创建一个共享开发环境,多个开发人员需要协作编辑代码,但各自的文件不应被其他人修改。
解决方案:
- 创建开发组和用户:
bash
# 创建开发组
sudo groupadd developers
# 创建开发用户
sudo useradd -m -G developers -s /bin/bash dev1
sudo useradd -m -G developers -s /bin/bash dev2
sudo useradd -m -G developers -s /bin/bash dev3
# 设置密码
sudo passwd dev1
sudo passwd dev2
sudo passwd dev3
- 创建共享目录结构:
bash
# 创建项目目录
sudo mkdir -p /opt/project/{shared,dev1,dev2,dev3}
# 设置基础权限
sudo chown -R root:developers /opt/project
sudo chmod 2775 /opt/project # 设置SGID
# 设置个人目录权限
sudo chown dev1:developers /opt/project/dev1
sudo chown dev2:developers /opt/project/dev2
sudo chown dev3:developers /opt/project/dev3
sudo chmod 0750 /opt/project/dev{1,2,3}
# 设置共享目录权限
sudo chown root:developers /opt/project/shared
sudo chmod 2775 /opt/project/shared
- 使用ACL设置精细权限:
bash
# 允许所有开发者读取彼此的目录
sudo setfacl -m g:developers:r-x /opt/project/dev{1,2,3}
# 设置共享目录的默认ACL
sudo setfacl -dm g:developers:rwx /opt/project/shared
sudo setfacl -m g:developers:rwx /opt/project/shared
- 设置密码策略:
bash
# 设置90天密码过期策略
sudo chage -M 90 -W 7 -I 14 dev{1,2,3}
4.2 案例二:Web服务器权限优化
需求:配置一个安全的Web服务器环境,允许开发人员更新网站内容,但保护配置文件。
解决方案:
- 创建用户和组:
bash
# 创建Web服务用户和组
sudo groupadd www-data
sudo useradd -r -s /sbin/nologin -g www-data www-data
# 创建开发者组和用户
sudo groupadd webdev
sudo useradd -m -G webdev -s /bin/bash webuser1
sudo passwd webuser1
- 设置Web目录权限:
bash
# 创建Web目录结构
sudo mkdir -p /var/www/{html,logs,config}
# 设置基本权限
sudo chown -R www-data:www-data /var/www
sudo chmod -R 0750 /var/www
# 设置内容目录SGID和权限
sudo chown -R www-data:webdev /var/www/html
sudo chmod 2775 /var/www/html
sudo find /var/www/html -type d -exec chmod 2775 {} \;
sudo find /var/www/html -type f -exec chmod 0664 {} \;
- 使用ACL设置精细权限:
bash
# 允许开发者访问日志但不能修改
sudo setfacl -m g:webdev:r-x /var/www/logs
sudo setfacl -m g:webdev:r-- /var/www/logs/*
# 保护配置目录
sudo setfacl -m g:webdev:--- /var/www/config
- 设置umask:
bash
# 为webdev组用户设置适当的umask
echo "umask 0002" | sudo tee -a /home/webuser1/.bashrc
4.3 案例三:临时权限提升
需求:允许普通用户临时执行特定的管理任务,而不给予完全的sudo权限。
解决方案:
- 创建自定义脚本:
bash
# 创建脚本目录
sudo mkdir -p /usr/local/admin-scripts
# 创建重启服务的脚本
cat << 'EOF' | sudo tee /usr/local/admin-scripts/restart-web.sh
#!/bin/bash
# 重启Web服务的脚本
systemctl restart nginx
echo "Nginx服务已重启"
exit 0
EOF
# 设置权限
sudo chown root:root /usr/local/admin-scripts/restart-web.sh
sudo chmod 0755 /usr/local/admin-scripts/restart-web.sh
- 配置sudo特定权限:
bash
# 编辑sudoers文件
sudo visudo -f /etc/sudoers.d/web-admins
# 添加以下内容
# 允许web-admin组用户无密码执行特定脚本
%web-admin ALL=(root) NOPASSWD: /usr/local/admin-scripts/restart-web.sh
- 创建用户组并添加用户:
bash
# 创建管理组
sudo groupadd web-admin
# 将用户添加到组
sudo usermod -aG web-admin username
- 使用方法:
bash
# 用户现在可以执行
sudo /usr/local/admin-scripts/restart-web.sh
第五章:Linux权限管理脑图
总结与最佳实践
权限管理黄金法则
- 最小权限原则:只给用户完成任务所需的最小权限
- 职责分离:使用组和ACL实现权限分离
- 定期审计 :使用
find
命令定期检查特殊权限文件 - 密码策略 :使用
chage
强制实施密码更新策略 - 文档化:记录所有权限设置,便于维护和审计
常见命令速查表
任务 | 命令 | 示例 |
---|---|---|
创建用户 | useradd | sudo useradd -m -G sudo username |
修改用户组 | usermod | sudo usermod -aG docker username |
设置默认权限 | umask | umask 0027 |
设置精细权限 | setfacl | sudo setfacl -m u:user:rwx file |
设置特殊权限 | chmod | sudo chmod 2775 /shared |
修改所有者 | chown | sudo chown -R user:group /path |
设置密码策略 | chage | sudo chage -M 90 -W 7 username |
权限排错口诀
当遇到权限问题时,按以下顺序检查:
- 查看基本权限 :
ls -l
检查文件/目录权限 - 检查所有者 :
ls -l
查看所有者和组是否正确 - 检查ACL :
getfacl
查看是否有ACL规则影响 - 检查父目录:目录需要有执行权限才能访问其内容
- 检查SELinux :
getenforce
查看SELinux是否阻止访问 - 检查特殊权限:查看是否需要SUID/SGID/Sticky Bit
🧠 记忆口诀:「权限排错六步走:基本权限看所有,ACL父目录加SELinux,特权位置最后求」
🐧 感谢阅读!如果这篇文章对你有帮助,请点赞收藏支持一下!