第17课 chmod 文件权限设置
🎯 学习目标
完成本课学习后,你将能够:
- 理解Linux文件权限的三元组结构(所有者/组/其他用户)
- 熟练使用符号法(rwx)和数字法(777)设置文件权限
- 掌握目录权限与文件权限的区别
- 学会递归修改目录及其内容的权限
- 识别并避免常见的权限设置错误
📚 核心概念
权限三元组
在Linux系统中,每个文件/目录的权限由三个部分组成:
- 所有者(Owner) - 文件的创建者
- 所属组(Group) - 文件所属的用户组
- 其他用户(Others) - 系统中既不是所有者也不在所属组的用户
权限类型
每个部分都有三种基本权限:
- r (read) - 读取权限(数字表示:4)
- w (write) - 写入权限(数字表示:2)
- x (execute) - 执行权限(数字表示:1)
权限数字表示法原理:
r = 4, w = 2, x = 1
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 + 0 = 6
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
💻 代码示例
示例1:基础权限设置
#!/bin/bash
# 创建测试文件和目录
echo "Hello World" > testfile.txt
mkdir testdir
# 查看初始权限
ls -l testfile.txt
echo "--------------------------"
ls -ld testdir
# 使用符号法修改权限
# 给所有者添加执行权限,给组用户添加写权限
chmod u+x,g+w testfile.txt
echo "修改文件权限后:"
ls -l testfile.txt
# 使用数字法修改权限
# 所有者:读写执行(7),组用户:读执行(5),其他用户:读(4)
chmod 754 testfile.txt
echo "数字法修改后:"
ls -l testfile.txt
示例2:目录权限与递归修改
#!/bin/bash
# 创建多层目录结构
mkdir -p project/{src,bin,doc}
touch project/src/main.c
echo "echo 'Hello from script'" > project/bin/run.sh
# 查看目录结构及权限
echo "目录结构:"
find project -type f -exec ls -l {} \;
# 设置目录和文件权限
# 目录:所有者全权限,组用户读执行,其他用户无权限
chmod -R 750 project/
# 单独给脚本文件添加执行权限
chmod +x project/bin/run.sh
# 验证权限设置
echo "修改后的权限:"
ls -ld project/
ls -l project/bin/run.sh
ls -l project/src/main.c
示例3:特殊权限位设置
#!/bin/bash
# 创建测试文件
touch special_test.txt
# 设置SGID权限(设置组ID)
# 当目录设置SGID后,在该目录下创建的文件自动继承目录的组
chmod g+s special_test.txt
ls -l special_test.txt # 权限显示为 -rw-rwSr--
# 设置粘滞位(Sticky Bit)
# 常用于/tmp目录,只有文件所有者能删除文件
chmod +t /tmp/test_sticky 2>/dev/null || mkdir /tmp/test_sticky
chmod +t /tmp/test_sticky
ls -ld /tmp/test_sticky # 权限显示为 drwxrwxrwt
🏋️ 实践练习
练习1:基础权限设置
要求: 创建一个名为shared_report.txt的文件,设置以下权限:
- 所有者:读写权限 (rw-)
- 组用户:只读权限 (r--)
- 其他用户:无权限 (---) 然后验证权限是否正确。
预期命令和输出:
touch shared_report.txt
chmod 640 shared_report.txt
ls -l shared_report.txt
# 预期输出类似:-rw-r----- 1 user group 0 ... shared_report.txt
练习2:目录权限管理
要求: 创建一个team_project目录结构,要求:
- 目录本身:所有者全权限,组用户读和执行,其他用户只执行
- 目录下的所有文件:所有者读写,组用户只读,其他用户无权限
- 目录下的子目录:权限与主目录相同
预期步骤:
mkdir -p team_project/{docs,source,logs}
touch team_project/docs/notes.txt team_project/source/main.py
# 请写出完整的chmod命令序列
练习3:权限问题排查
要求: 你发现一个脚本文件backup.sh无法执行,即使你已经设置了chmod +x backup.sh。请检查可能的原因并提供解决方案。
思考提示:
- 检查文件是否真的设置了执行权限
- 检查文件内容是否有正确的shebang行(#!/bin/bash)
- 检查文件系统是否以noexec选项挂载
⚠️ 常见错误
1. 权限数字理解错误
错误示例: chmod 76 file.txt(你以为设置为rwxrw----)
实际结果: rwxrw----(76 = 4+2+0 = 6?不对!)
正确理解: 数字必须是三位数,chmod 076 file.txt才是rwxrw----
2. 忽略目录权限的特殊性
错误场景: 给目录设置了chmod 644 dir/
后果: 无法进入目录(需要执行权限x)
正确做法: 目录通常需要至少755或750权限
3. 递归修改时的过度授权
错误示例: chmod -R 777 /var/www/html
风险: 给所有用户完全控制权,存在严重安全风险
最佳实践: 网站目录通常设置为755,文件设置为644
4. 符号法组合错误
错误示例: chmod u=r,g=r,o=r file.txt(遗漏了数字法的连写)
正确写法: chmod a=r file.txt 或 chmod 444 file.txt
5. 忽略umask的影响
问题描述: 新建文件权限总是比预期少(如rw-r--r--而不是rw-rw-r--)
原因: umask值(默认022)会从权限中减去相应数字
解决方法: 使用umask 002或创建文件后显式设置权限
📝 小结
关键要点回顾:
- 权限结构:Linux权限由所有者、组、其他用户三部分组成,每部分包含读(r)、写(w)、执行(x)权限
- 两种表示法:
- 符号法:
u/g/o/a+/-r/w/x(如chmod u+x file) - 数字法:三位八进制数(如
chmod 755 file)
- 符号法:
- 目录vs文件:目录的执行权限(x)表示"可进入",文件的执行权限表示"可运行"
- 递归操作:
-R选项用于递归修改目录及其内容 - 安全原则:遵循最小权限原则,避免不必要的过度授权
实用技巧:
- 使用
ls -l查看权限时,第一列的10个字符中,第2-4位是所有者权限,第5-7位是组权限,第8-10位是其他用户权限 - 数字法记忆口诀:"4读2写1执行,三个数字分别算"
- 对于共享目录,考虑使用SGID(
g+s)让新建文件自动继承组权限
下一步学习:
下一课我们将学习chown和chgrp命令,了解如何修改文件的所有者和所属组,这是文件权限管理的另一重要组成部分。掌握chmod和chown的组合使用,你就能全面控制Linux系统中的文件访问权限了!