第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:同时修改所属组和其他用户的权限
  • ugoa:修改所有用户的权限

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. 特殊权限的符号表示

特殊权限也可以使用符号表示法设置:

  • SUIDu+s
  • SGIDg+s
  • Sticky Bito+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

课后练习

  1. 基础练习

    • 创建一个文件,使用符号表示法给所有者添加执行权限
    • 创建一个目录,使用符号表示法给所属组添加写入权限
    • 使用符号表示法从其他用户移除读取权限
  2. 进阶练习

    • 使用符号表示法设置文件权限为:所有者有rwx,所属组有rx,其他用户有r
    • 使用符号表示法设置目录权限为:所有者有rwx,所属组有rwx,其他用户无权限
    • 编写一个脚本,批量修改指定目录下所有.sh文件的权限,添加执行权限
  3. 思考问题

    • 为什么对于目录来说,执行权限如此重要?
    • 在什么场景下,符号表示法比数字表示法更适合?
    • 如何使用符号表示法设置特殊权限(SUID、SGID、Sticky Bit)?
    • 当使用chmod o+t设置Sticky Bit时,它对目录有什么影响?
    • 如何使用符号表示法实现最小权限原则?

总结

本集详细介绍了Linux系统中权限的字母(符号)表示方法,包括:

  • 符号表示法的基本语法和组成部分
  • 权限操作的三种类型:添加(+)、移除(-)和设置(=)
  • 特殊权限的符号表示方法
  • 符号表示法的优点和缺点
  • 符号表示法与数字表示法的对比
  • 各种权限操作的实际示例

符号表示法是Linux系统中管理权限的重要工具,特别适合于需要修改部分权限的场景。通过本集的学习,您应该能够掌握符号表示法的基本语法和使用方法,并且能够根据实际需求选择合适的权限表示方法。

在实际应用中,符号表示法和数字表示法各有优缺点,应该根据具体场景灵活选择:

  • 对于简单的权限修改,符号表示法更加直观
  • 对于完整的权限设置,数字表示法更加简洁
  • 对于脚本编写,数字表示法更加适合
  • 对于交互式操作,符号表示法更加友好

掌握这两种权限表示方法,将使您在Linux系统管理中更加得心应手。

« 上一篇 权限数字表示法 下一篇 » 特殊权限设置