第32集:权限字母表示法
教学目标
- 理解Linux系统中权限字母表示法的基本原理
- 掌握符号表示法的语法规则和使用方法
- 熟悉常见的权限修改操作
- 掌握使用符号表示法设置和修改文件与目录权限
- 理解符号表示法与数字表示法的区别和适用场景
- 能够根据实际需求选择合适的权限表示方法
核心知识点讲解
1. 权限字母表示法概述
权限字母表示法(也称为符号表示法)是Linux系统中表示和修改文件与目录权限的一种直观方法。与数字表示法相比,符号表示法更加直观易懂,特别适合于修改部分权限的场景。
2. 符号表示法的基本语法
符号表示法的基本语法格式为:
chmod [who][operator][permissions] file/directory其中:
who:指定要修改权限的用户类别
u:所有者(user)g:所属组(group)o:其他用户(others)a:所有用户(all)
operator:指定权限操作类型
+:添加权限-:移除权限=:设置权限(覆盖原有权限)
permissions:指定要修改的权限
r:读取权限w:写入权限x:执行权限
3. 权限类别(who)的组合
可以同时指定多个用户类别,用逗号分隔:
ug:同时修改所有者和所属组的权限go:同时修改所属组和其他用户的权限ugo或a:修改所有用户的权限
4. 权限(permissions)的组合
可以同时指定多个权限,直接连接:
rw:同时设置读取和写入权限rx:同时设置读取和执行权限rwx:同时设置读取、写入和执行权限
5. 符号表示法的操作类型
添加权限(+)
在现有权限基础上添加新的权限:
u+x:给所有者添加执行权限g+w:给所属组添加写入权限o+r:给其他用户添加读取权限
移除权限(-)
从现有权限中移除指定的权限:
u-x:从所有者移除执行权限g-w:从所属组移除写入权限o-r:从其他用户移除读取权限
设置权限(=)
直接设置权限,覆盖原有权限:
u=rwx:将所有者权限设置为读取、写入和执行g=rx:将所属组权限设置为读取和执行o=r:将其他用户权限设置为读取
6. 特殊权限的符号表示
特殊权限也可以使用符号表示法设置:
- SUID:
u+s - SGID:
g+s - Sticky Bit:
o+t
7. 符号表示法的优点
- 直观易懂:使用字母表示权限,更加直观
- 灵活精确:可以精确修改部分权限,不需要重新计算所有权限
- 可读性强:命令意图清晰,便于理解和维护
- 适合增量修改:特别适合于在现有权限基础上进行微调
8. 符号表示法的缺点
- 命令较长:对于复杂的权限设置,命令可能较长
- 脚本友好性差:在脚本中使用时,可能不如数字表示法简洁
- 学习成本:需要记住各种符号和语法规则
9. 符号表示法与数字表示法的对比
| 特性 | 符号表示法 | 数字表示法 |
|---|---|---|
| 直观性 | 高 | 低 |
| 简洁性 | 低 | 高 |
| 灵活性 | 高 | 低 |
| 脚本友好性 | 低 | 高 |
| 学习难度 | 低 | 中 |
| 适合场景 | 增量修改权限 | 完整设置权限 |
10. 常见的符号表示法操作
| 操作 | 含义 | 等效数字表示 |
|---|---|---|
chmod u+x file |
给所有者添加执行权限 | - |
chmod g+w file |
给所属组添加写入权限 | - |
chmod o-r file |
从其他用户移除读取权限 | - |
chmod u=rwx file |
将所有者权限设置为rwx | - |
chmod g=rx file |
将所属组权限设置为rx | - |
chmod o=r file |
将其他用户权限设置为r | - |
chmod a=rwx file |
给所有用户设置rwx权限 | chmod 777 file |
chmod ug=rw,o=r file |
设置所有者和所属组为rw,其他用户为r | chmod 664 file |
chmod u=rwx,go=rx file |
设置所有者为rwx,其他用户为rx | chmod 755 file |
chmod u=rw,go= file |
设置所有者为rw,其他用户无权限 | chmod 600 file |
操作示例
示例1:添加权限
# 创建测试文件
touch test_file
ls -l test_file
# 给所有者添加执行权限
chmod u+x test_file
ls -l test_file
# 给所属组添加写入权限
chmod g+w test_file
ls -l test_file
# 给其他用户添加读取权限
chmod o+r test_file
ls -l test_file
# 给所有用户添加执行权限
chmod a+x test_file
ls -l test_file
# 给所有者和所属组同时添加写入权限
chmod ug+w test_file
ls -l test_file示例2:移除权限
# 从所有者移除执行权限
chmod u-x test_file
ls -l test_file
# 从所属组移除写入权限
chmod g-w test_file
ls -l test_file
# 从其他用户移除读取权限
chmod o-r test_file
ls -l test_file
# 从所有用户移除执行权限
chmod a-x test_file
ls -l test_file
# 从所有者和所属组同时移除写入权限
chmod ug-w test_file
ls -l test_file示例3:设置权限
# 将所有者权限设置为rwx
chmod u=rwx test_file
ls -l test_file
# 将所属组权限设置为rx
chmod g=rx test_file
ls -l test_file
# 将其他用户权限设置为r
chmod o=r test_file
ls -l test_file
# 同时设置多个用户类别的权限
chmod u=rwx,g=rx,o=r test_file
ls -l test_file
# 使用=操作符覆盖所有权限
chmod a=rw test_file
ls -l test_file示例4:目录权限操作
# 创建测试目录
mkdir test_dir
ls -ld test_dir
# 给所有者添加执行权限(对于目录,执行权限允许进入目录)
chmod u+x test_dir
ls -ld test_dir
# 给所属组添加写入权限(对于目录,写入权限允许创建、删除文件)
chmod g+w test_dir
ls -ld test_dir
# 给其他用户添加读取权限(对于目录,读取权限允许列出目录内容)
chmod o+r test_dir
ls -ld test_dir
# 递归修改目录及其内容的权限
chmod -R u+rwx test_dir
ls -la test_dir示例5:特殊权限操作
# 设置SUID权限
chmod u+s test_file
ls -l test_file
# 移除SUID权限
chmod u-s test_file
ls -l test_file
# 设置SGID权限
chmod g+s test_file
ls -l test_file
# 移除SGID权限
chmod g-s test_file
ls -l test_file
# 设置Sticky Bit(通常用于目录)
chmod o+t test_dir
ls -ld test_dir
# 移除Sticky Bit
chmod o-t test_dir
ls -ld test_dir示例6:复杂权限操作
# 示例1:给所有者添加读写权限,给所属组添加读权限,从其他用户移除所有权限
chmod u+rw,g+r,o-rwx test_file
ls -l test_file
# 示例2:设置所有者为rwx,所属组为rx,其他用户无权限
chmod u=rwx,g=rx,o= test_file
ls -l test_file
# 示例3:给所有用户添加读权限,给所有者和所属组添加执行权限
chmod a+r,ug+x test_file
ls -l test_file
# 示例4:从所有用户移除执行权限,给所有者添加写入权限
chmod a-x,u+w test_file
ls -l test_file示例7:权限操作脚本
# 创建权限管理脚本
cat > permission_script.sh << 'EOF'
#!/bin/bash
# 显示菜单
echo "权限管理脚本(符号表示法)"
echo "1. 给文件添加执行权限"
echo "2. 给文件移除写入权限"
echo "3. 设置文件为只读权限"
echo "4. 设置文件为完全权限"
echo "5. 给目录添加写入权限"
echo "6. 给目录设置默认权限"
echo "7. 退出"
read -p "请选择操作:" choice
case $choice in
1)
read -p "请输入文件路径:" path
if [ -f "$path" ]; then
chmod +x "$path"
echo "已添加执行权限"
ls -l "$path"
else
echo "错误:路径不存在或不是文件"
fi
;;
2)
read -p "请输入文件路径:" path
if [ -f "$path" ]; then
chmod -w "$path"
echo "已移除写入权限"
ls -l "$path"
else
echo "错误:路径不存在或不是文件"
fi
;;
3)
read -p "请输入文件路径:" path
if [ -f "$path" ]; then
chmod a=r "$path"
echo "已设置为只读权限"
ls -l "$path"
else
echo "错误:路径不存在或不是文件"
fi
;;
4)
read -p "请输入文件路径:" path
if [ -f "$path" ]; then
chmod a=rwx "$path"
echo "已设置为完全权限"
ls -l "$path"
else
echo "错误:路径不存在或不是文件"
fi
;;
5)
read -p "请输入目录路径:" path
if [ -d "$path" ]; then
chmod +w "$path"
echo "已添加写入权限"
ls -ld "$path"
else
echo "错误:路径不存在或不是目录"
fi
;;
6)
read -p "请输入目录路径:" path
if [ -d "$path" ]; then
chmod u=rwx,g=rx,o=rx "$path"
echo "已设置为默认权限(755)"
ls -ld "$path"
else
echo "错误:路径不存在或不是目录"
fi
;;
7)
echo "退出脚本"
exit 0
;;
*)
echo "无效的选择"
;;
esac
EOF
# 使脚本可执行
chmod +x permission_script.sh
# 运行脚本
./permission_script.sh示例8:权限操作的实际应用
# 示例1:准备可执行脚本
cat > backup.sh << 'EOF'
#!/bin/bash
echo "执行备份操作..."
# 备份命令
EOF
# 查看初始权限
ls -l backup.sh
# 添加执行权限
chmod +x backup.sh
ls -l backup.sh
# 示例2:保护配置文件
cp /etc/sysctl.conf /tmp/
ls -l /tmp/sysctl.conf
# 移除写入权限,防止意外修改
chmod -w /tmp/sysctl.conf
ls -l /tmp/sysctl.conf
# 示例3:设置共享目录
mkdir /tmp/shared
ls -ld /tmp/shared
# 给所有用户添加读写执行权限
chmod a=rwx /tmp/shared
ls -ld /tmp/shared
# 添加Sticky Bit,防止用户删除其他用户的文件
chmod +t /tmp/shared
ls -ld /tmp/shared示例9:权限操作的组合使用
# 创建测试文件
for i in {1..5}; do
touch test_file$i.txt
echo "Test content $i" > test_file$i.txt
done
# 查看初始权限
ls -l test_file*.txt
# 批量给所有文件添加执行权限
chmod +x test_file*.txt
ls -l test_file*.txt
# 批量设置权限为644
chmod u=rw,g=r,o=r test_file*.txt
ls -l test_file*.txt
# 批量给所有者添加执行权限
chmod u+x test_file*.txt
ls -l test_file*.txt
# 清理测试文件
rm test_file*.txt示例10:权限操作的注意事项
# 注意事项1:对于目录,执行权限是其他权限的基础
mkdir no_exec_dir
chmod a=r no_exec_dir # 只给读取权限,没有执行权限
ls -ld no_exec_dir
# 尝试进入目录(会失败,因为没有执行权限)
cd no_exec_dir || echo "无法进入目录,缺少执行权限"
cd ..
# 添加执行权限
chmod +x no_exec_dir
ls -ld no_exec_dir
# 现在可以进入目录
cd no_exec_dir && echo "成功进入目录"
cd ..
# 注意事项2:对于脚本文件,需要执行权限才能运行
cat > test_script.sh << 'EOF'
echo "Hello, World!"
EOF
# 尝试运行脚本(会失败,因为没有执行权限)
./test_script.sh || echo "无法执行脚本,缺少执行权限"
# 添加执行权限
chmod +x test_script.sh
# 现在可以运行脚本
./test_script.sh
# 清理测试文件和目录
rm -rf no_exec_dir test_script.sh课后练习
基础练习:
- 创建一个文件,使用符号表示法给所有者添加执行权限
- 创建一个目录,使用符号表示法给所属组添加写入权限
- 使用符号表示法从其他用户移除读取权限
进阶练习:
- 使用符号表示法设置文件权限为:所有者有rwx,所属组有rx,其他用户有r
- 使用符号表示法设置目录权限为:所有者有rwx,所属组有rwx,其他用户无权限
- 编写一个脚本,批量修改指定目录下所有.sh文件的权限,添加执行权限
思考问题:
- 为什么对于目录来说,执行权限如此重要?
- 在什么场景下,符号表示法比数字表示法更适合?
- 如何使用符号表示法设置特殊权限(SUID、SGID、Sticky Bit)?
- 当使用
chmod o+t设置Sticky Bit时,它对目录有什么影响? - 如何使用符号表示法实现最小权限原则?
总结
本集详细介绍了Linux系统中权限的字母(符号)表示方法,包括:
- 符号表示法的基本语法和组成部分
- 权限操作的三种类型:添加(+)、移除(-)和设置(=)
- 特殊权限的符号表示方法
- 符号表示法的优点和缺点
- 符号表示法与数字表示法的对比
- 各种权限操作的实际示例
符号表示法是Linux系统中管理权限的重要工具,特别适合于需要修改部分权限的场景。通过本集的学习,您应该能够掌握符号表示法的基本语法和使用方法,并且能够根据实际需求选择合适的权限表示方法。
在实际应用中,符号表示法和数字表示法各有优缺点,应该根据具体场景灵活选择:
- 对于简单的权限修改,符号表示法更加直观
- 对于完整的权限设置,数字表示法更加简洁
- 对于脚本编写,数字表示法更加适合
- 对于交互式操作,符号表示法更加友好
掌握这两种权限表示方法,将使您在Linux系统管理中更加得心应手。