- Linux 文件权限系统详解:基于UGO的权限管理
- 一、Linux权限基础概念
- 1.1 UGO权限模型
- 1.2 权限类型
- 二、权限表示方法详解
- 2.1 字符表示法(ls -l 输出)
- 权限字符串结构
- 权限字符分解
- 实际查看示例
- 2.2 数字表示法(八进制表示)
- 权限数字计算
- 常见权限组合数字表示
- 三、权限管理命令详解
- 3.1 chmod 命令 - 更改权限
- 基本语法
- 权限指定方式
- 1. 数字方式(最常用)
- 2. 字符方式(UGO+/-权限)
- 常用选项
- 实战示例
- 3.2 chown 命令 - 更改所有者和所属组
- 基本语法
- 常用选项
- 实战示例
- 3.3 chgrp 命令 - 更改所属组
- 基本语法
- 示例
- 四、umask 原理与使用
- 4.1 umask 概念解析
- umask 作用
- umask 计算规则
- 常见umask值与对应权限
- 4.2 umask 使用实战
- 查看当前umask
- 设置umask值
- umask实际效果测试
- 五、特殊权限详解
- 5.1 三种特殊权限
- SUID(Set User ID)
- SGID(Set Group ID)
- Sticky Bit(粘滞位)
- 5.2 特殊权限设置示例
- 六、实际应用场景案例
- 6.1 Web服务器权限配置
- 典型Web目录结构权限
- 6.2 用户家目录安全配置
- 安全的家目录设置
- 6.3 共享目录配置
- 团队项目目录配置
- 6.4 系统关键文件权限
- 重要系统文件权限示例
- 七、权限问题排查技巧
- 7.1 权限检查命令
- 常用排查命令
- 权限问题诊断流程
- 7.2 常见权限问题解决
- 权限被拒绝错误处理
- 八、综合课堂练习
- 练习1:基础权限设置(15分钟)
- 练习2:Web服务器权限实战(20分钟)
- 练习3:权限问题排查(15分钟)
- 练习4:安全权限配置(10分钟)
Linux 文件权限系统详解:基于UGO的权限管理
一、Linux权限基础概念
1.1 UGO权限模型
Linux使用UGO(User/Group/Other) 三级权限模型:
- U:文件所有者(User)
- G:文件所属组(Group)
- O:其他用户(Other)
1.2 权限类型
每种身份都有三种基本权限:
| 权限 | 字符表示 | 数字表示 | 对文件的影响 | 对目录的影响 |
|——|———-|———-|————–|————–|
| 读 | r | 4 | 查看文件内容 | 列出目录内容 |
| 写 | w | 2 | 修改文件内容 | 在目录中创建/删除文件 |
| 执行 | x | 1 | 执行文件(程序/脚本) | 进入目录 |
二、权限表示方法详解
2.1 字符表示法(ls -l 输出)
权限字符串结构
-rwxr-xr-- 1 owner group size date filename
类型UGO权限 链接数 属主 属组 大小 时间 文件名权限字符分解
- r w x r - x r - -
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ └── 其他用户:执行权限
│ │ │ │ │ │ │ │ └──── 其他用户:写权限
│ │ │ │ │ │ │ └────── 其他用户:读权限
│ │ │ │ │ │ └──────── 所属组:执行权限
│ │ │ │ │ └────────── 所属组:写权限
│ │ │ │ └──────────── 所属组:读权限
│ │ │ └────────────── 文件所有者:执行权限
│ │ └──────────────── 文件所有者:写权限
│ └────────────────── 文件所有者:读权限
└──────────────────── 文件类型(-普通文件,d目录,l链接等)实际查看示例
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 1500 Dec 25 10:30 /etc/passwd
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Dec 25 11:00 /tmp
$ ls -l /bin/ls
-rwxr-xr-x 1 root root 142144 Oct 18 12:30 /bin/ls2.2 数字表示法(八进制表示)
权限数字计算
rwx r-x r-- → 111 101 100 → 7 5 4
rw- r-- r-- → 110 100 100 → 6 4 4常见权限组合数字表示
| 权限组合 | 数字表示 | 字符表示 | 适用场景 |
|---|---|---|---|
| 完全权限 | 777 | rwxrwxrwx | 临时目录,危险! |
| 所有者全权,其他只读 | 755 | rwxr-xr-x | 可执行程序,目录 |
| 所有者全权,其他无 | 700 | rwx—— | 用户私有目录 |
| 所有者读写,其他只读 | 644 | rw-r–r– | 配置文件,普通文件 |
| 所有者读写,其他无 | 600 | rw——- | 敏感数据文件 |
三、权限管理命令详解
3.1 chmod 命令 - 更改权限
基本语法
chmod [选项] 权限 文件/目录...权限指定方式
1. 数字方式(最常用)
chmod 755 script.sh
chmod 644 config.txt
chmod 700 ~/.ssh2. 字符方式(UGO+/-权限)
# 添加权限
chmod u+x script.sh # 给所有者添加执行权限
chmod g+w file.txt # 给组添加写权限
chmod o+r document.pdf # 给其他人添加读权限
chmod a+x program # 给所有人添加执行权限(a=all)
# 移除权限
chmod u-w secret.txt # 移除所有者的写权限
chmod go-rwx confidential # 移除组和其他人的所有权限
# 设置精确权限
chmod u=rwx,g=rx,o= file # 设置精确权限(相当于750)常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-R |
递归操作目录及其内容 | chmod -R 755 /webroot |
-v |
显示更改信息 | chmod -v 644 *.conf |
-c |
只在有更改时显示信息 | chmod -c 600 key.pem |
实战示例
# 设置脚本可执行
chmod +x myscript.sh # 简写,给所有人执行权限
chmod 755 myscript.sh # 明确设置权限
# 保护敏感文件
chmod 600 ~/.ssh/id_rsa # 私钥文件,仅自己可读
chmod 644 ~/.ssh/id_rsa.pub # 公钥文件,可公开
# 目录权限设置
chmod 755 /var/www/html # Web目录,需要执行权限才能访问
chmod 700 ~/private # 私有目录,其他人完全无法访问
# 递归修改目录权限
chmod -R 644 /home/user/docs/ # 修改目录下所有文件权限(危险!会去掉执行权限)
chmod -R 755 /usr/local/bin/ # 保持目录可执行权限
# 组合权限操作
chmod u=rw,go= config.conf # 设置精确权限(600)
chmod a-w important.txt # 所有人不可写(防止误修改)3.2 chown 命令 - 更改所有者和所属组
基本语法
chown [选项] 用户名:组名 文件/目录...
chown [选项] 用户名 文件/目录... # 只改所有者
chown [选项] :组名 文件/目录... # 只改组常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-R |
递归操作 | chown -R user:group /data |
-v |
显示详细信息 | chown -v user file |
-c |
只在有更改时报告 | chown -c user:group * |
实战示例
# 更改文件所有者
chown alice document.txt
chown bob:developers script.sh
# 更改目录所有者(递归)
chown -R www-data:www-data /var/www/html
# 只更改所属组
chown :staff /shared/data
chown -R :developers /project/src
# Web服务器文件权限设置
chown -R www-data:www-data /var/www/example.com
chmod -R 755 /var/www/example.com
find /var/www/example.com -type f -exec chmod 644 {} \; # 文件644
find /var/www/example.com -type d -exec chmod 755 {} \; # 目录7553.3 chgrp 命令 - 更改所属组
基本语法
chgrp [选项] 组名 文件/目录...示例
chgrp staff report.pdf
chgrp -R developers /project/code四、umask 原理与使用
4.1 umask 概念解析
umask 作用
umask(权限掩码)决定新创建文件/目录的默认权限
umask 计算规则
- 目录默认权限:777 - umask
- 文件默认权限:666 - umask(自动去掉执行权限)
常见umask值与对应权限
| umask值 | 目录权限 | 文件权限 | 说明 |
|---|---|---|---|
| 0022 | 755 (rwxr-xr-x) | 644 (rw-r–r–) | 默认设置 |
| 0002 | 775 (rwxrwxr-x) | 664 (rw-rw-r–) | 组可写 |
| 0077 | 700 (rwx——) | 600 (rw——-) | 完全私有 |
| 0000 | 777 (rwxrwxrwx) | 666 (rw-rw-rw-) | 完全开放 |
4.2 umask 使用实战
查看当前umask
# 查看当前umask(数字显示)
umask
# 输出:0022
# 查看当前umask(符号显示)
umask -S
# 输出:u=rwx,g=rx,o=rx设置umask值
# 临时设置(当前会话有效)
umask 0022
# 永久设置(添加到shell配置文件中)
echo "umask 0022" >> ~/.bashrc
source ~/.bashrc
# 针对特定用户设置
echo "umask 0002" >> /home/developer/.bashrc # 开发用户,组可写umask实际效果测试
# 测试不同umask的效果
umask 0022
mkdir test_dir1
touch test_file1
ls -ld test_dir1 test_file1
# 输出:drwxr-xr-x test_dir1, -rw-r--r-- test_file1
umask 0002
mkdir test_dir2
touch test_file2
ls -ld test_dir2 test_file2
# 输出:drwxrwxr-x test_dir2, -rw-rw-r-- test_file2
umask 0077
mkdir test_dir3
touch test_file3
ls -ld test_dir3 test_file3
# 输出:drwx------ test_dir3, -rw------- test_file3五、特殊权限详解
5.1 三种特殊权限
SUID(Set User ID)
- 数字表示:4000
- 字符位置:用户执行位(s代替x)
- 作用:执行文件时以文件所有者身份运行
- 示例:
/usr/bin/passwd
SGID(Set Group ID)
- 数字表示:2000
- 字符位置:组执行位(s代替x)
- 目录作用:新建文件继承目录的组
- 示例:
/usr/bin/wall
Sticky Bit(粘滞位)
- 数字表示:1000
- 字符位置:其他用户执行位(t代替x)
- 作用:只有文件所有者和root能删除文件
- 示例:
/tmp目录
5.2 特殊权限设置示例
# 设置SUID(普通用户执行passwd时可修改/etc/shadow)
chmod u+s /usr/bin/passwd
chmod 4755 /usr/bin/passwd
# 设置SGID(目录下新建文件自动继承组)
chmod g+s /shared/group_dir
chmod 2775 /shared/group_dir
# 设置Sticky Bit(/tmp目录特性)
chmod o+t /tmp
chmod 1777 /tmp
# 查看特殊权限
ls -ld /tmp /usr/bin/passwd
# 输出:drwxrwxrwt /tmp, -rwsr-xr-x /usr/bin/passwd六、实际应用场景案例
6.1 Web服务器权限配置
典型Web目录结构权限
# Nginx/Apache网站目录配置
chown -R www-data:www-data /var/www/example.com
find /var/www/example.com -type d -exec chmod 755 {} \; # 目录755
find /var/www/example.com -type f -exec chmod 644 {} \; # 文件644
# 可写目录(上传、缓存等)
chmod 775 /var/www/example.com/uploads
chmod 775 /var/www/example.com/cache
# 敏感配置文件
chmod 600 /var/www/example.com/config/database.php6.2 用户家目录安全配置
安全的家目录设置
# 检查当前家目录权限
ls -ld ~/
# 安全设置(防止其他用户访问)
chmod 750 ~/ # 目录750
chmod 700 ~/.ssh/ # SSH目录私有
chmod 600 ~/.ssh/* # 密钥文件私有
# 设置umask保证新文件安全
echo "umask 0077" >> ~/.bashrc # 或umask 0027(组可读)6.3 共享目录配置
团队项目目录配置
# 创建共享目录
mkdir /shared/project
chown :developers /shared/project
chmod 2775 /shared/project # SGID确保文件继承组
# 用户添加到组
usermod -aG developers alice
usermod -aG developers bob
# 设置umask便于协作
echo "umask 0002" >> /etc/profile # 所有用户新文件组可写6.4 系统关键文件权限
重要系统文件权限示例
# 密码文件安全
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 600 /etc/gshadow
# 系统日志文件
chmod 640 /var/log/auth.log
chown root:adm /var/log/auth.log
# 定时任务配置
chmod 600 /etc/crontab
chmod 700 /etc/cron.hourly/七、权限问题排查技巧
7.1 权限检查命令
常用排查命令
# 检查文件权限
ls -l filename
ls -ld directory
# 检查用户身份
id
whoami
groups
# 检查实际权限(测试用户能力)
sudo -u otheruser ls /path/to/file
# 详细权限信息
getfacl filename # 查看ACL权限(如果设置)权限问题诊断流程
# 1. 检查文件权限
ls -l problem_file
# 2. 检查文件所有者和组
ls -l problem_file
# 3. 检查当前用户身份和所属组
id
# 4. 检查目录权限(重要!)
namei -l /path/to/problem_file
# 5. 检查SELinux上下文(如果启用)
ls -Z problem_file7.2 常见权限问题解决
权限被拒绝错误处理
# 问题:无法执行脚本
chmod +x script.sh
# 问题:无法读取文件
chmod o+r file.txt # 或调整文件所有者
# 问题:无法写入目录
chmod o+w directory/ # 或使用正确用户身份
# 问题:无法删除文件(检查目录写权限和sticky bit)
ls -ld containing_directory/八、综合课堂练习
练习1:基础权限设置(15分钟)
任务:创建测试环境并设置权限
# 1. 创建测试目录结构
# 2. 设置不同的权限组合
# 3. 测试权限效果
# 4. 理解umask影响参考答案:
# 创建测试环境
mkdir -p /tmp/permission_test/{public,private,shared}
touch /tmp/permission_test/{file1.txt,file2.conf}
# 设置不同权限
chmod 755 /tmp/permission_test/public # 公共目录
chmod 700 /tmp/permission_test/private # 私有目录
chmod 775 /tmp/permission_test/shared # 共享目录
chmod 644 /tmp/permission_test/file1.txt # 普通文件
chmod 600 /tmp/permission_test/file2.conf # 配置文件
# 测试umask影响
umask 0022
touch /tmp/permission_test/umask_test1.txt
umask 0077
touch /tmp/permission_test/umask_test2.txt
ls -l /tmp/permission_test/umask_test*.txt练习2:Web服务器权限实战(20分钟)
任务:配置安全的Web目录权限
# 要求:
# 1. 创建Web目录结构
# 2. 设置安全的权限
# 3. 配置可写目录
# 4. 测试权限安全性参考答案:
# 创建Web目录结构
mkdir -p /tmp/webroot/{html,uploads,config,logs}
# 设置所有者和组
chown -R www-data:www-data /tmp/webroot
# 设置目录权限(755)
find /tmp/webroot -type d -exec chmod 755 {} \;
# 设置文件权限(644)
find /tmp/webroot -type f -exec chmod 644 {} \;
# 特殊目录设置
chmod 775 /tmp/webroot/uploads # 上传目录可写
chmod 750 /tmp/webroot/config # 配置目录受限
chmod 600 /tmp/webroot/config/db.php # 数据库配置私有
# 创建测试文件验证
sudo -u www-data touch /tmp/webroot/uploads/test.txt
sudo -u www-data touch /tmp/webroot/html/index.html
# 验证权限
namei -l /tmp/webroot/html/index.html练习3:权限问题排查(15分钟)
任务:诊断和修复权限问题
# 场景:
# 1. 用户无法访问文件
# 2. 脚本无法执行
# 3. 目录无法写入
# 4. 特殊权限问题诊断脚本:
#!/bin/bash
check_permission() {
local file=$1
echo "=== 检查: $file ==="
# 检查文件是否存在
if [ ! -e "$file" ]; then
echo "错误: 文件不存在"
return 1
fi
# 显示详细信息
ls -la "$file"
echo
# 检查目录权限路径
if [ -f "$file" ]; then
echo "路径权限检查:"
namei -l "$file"
fi
# 检查SELinux上下文
if command -v ls >/dev/null 2>&1 && ls -Z "$file" >/dev/null 2>&1; then
echo "SELinux上下文:"
ls -Z "$file"
fi
}
# 使用示例
check_permission "/path/to/problem/file"练习4:安全权限配置(10分钟)
任务:编写安全权限配置脚本
# 要求:
# 1. 自动化安全权限设置
# 2. 支持不同场景配置
# 3. 包含错误处理
# 4. 生成权限报告安全配置脚本框架:
#!/bin/bash
# security_permissions.sh
set_secure_permissions() {
local path=$1
local type=$2
case $type in
"web")
find "$path" -type d -exec chmod 755 {} \;
find "$path" -type f -exec chmod 644 {} \;
;;
"config")
chmod 600 "$path"/*
;;
"scripts")
find "$path" -name "*.sh" -exec chmod 755 {} \;
;;
esac
echo "已设置 $path 为 $type 权限模式"
}
# 使用示例
set_secure_permissions "/var/www" "web"
set_secure_permissions "/etc/nginx/conf.d" "config"通过本教程的深入学习,你应该能够全面掌握Linux UGO权限系统,熟练进行权限管理和故障排查。
作者:严锋 创建时间:2025-11-01 11:27
最后编辑:严锋 更新时间:2025-11-04 21:33
最后编辑:严锋 更新时间:2025-11-04 21:33