1.2.2 文件类型与权限模型

文件类型与权限模型#

Linux 以“文件类型 + 权限位”的组合实现访问控制与对象行为定义。文件类型由权限位首字符表示;权限模型通过 用户(u)/组(g)/其他(o)读(r)/写(w)/执行(x) 组合完成校验。

文章图片

权限含义速记#

  • 读(r)
  • 普通文件:可读取内容
  • 目录:可列出目录项
  • 写(w)
  • 普通文件:可修改内容
  • 目录:可新增/删除/重命名目录项
  • 执行(x)
  • 普通文件:可执行
  • 目录:可进入与访问目录内对象

权限表示方式:
- 符号表示-rwxr-x---
- 数字表示r=4, w=2, x=1,如 750 表示 rwxr-x---

路径与通配符速记(绝对路径 / 相对路径 / 通配符)#

  • 绝对路径:从根目录 / 开始,例如 /etc/nginx/nginx.conf
  • 相对路径:从当前工作目录开始,例如 ./logs/app.log../conf/app.conf
  • 通配符(globbing):由 shell 展开匹配
  • * 匹配任意长度字符
  • ? 匹配单个字符
  • [abc] 匹配集合中的单个字符
  • [a-z] 匹配区间内单个字符
  • {a,b} 匹配枚举项(非正则,shell 语法)
# 预设工作目录
mkdir -p /tmp/perm_demo && cd /tmp/perm_demo

# 绝对路径与相对路径
pwd
# 预期:/tmp/perm_demo
ls /tmp/perm_demo            # 绝对路径
ls ./                        # 相对路径(当前目录)
ls ../                       # 相对路径(上级目录)

# 通配符示例
touch app.log app.err app1.log app2.log data.txt
ls *.log                     # 匹配所有 .log 文件
ls app?.log                  # 匹配 app1.log app2.log
ls app.[el]rr                # 匹配 app.err(.e 或 .l 之一)
ls app{1,2}.log              # 匹配 app1.log app2.log

环境准备与验证(无需安装)#

本节不依赖额外软件,仅需常用系统工具:lsstatfiletouchmkdirlnmkfifomknod

# 检查工具是否存在
for cmd in ls stat file touch mkdir ln mkfifo mknod; do
  command -v $cmd >/dev/null || echo "缺少命令: $cmd"
done

文件类型识别与示例#

# 1) 普通文件
touch file.txt
ls -l file.txt
# 预期:-rw-r--r-- 1 user group 0 ... file.txt

# 2) 目录
mkdir dir1
ls -ld dir1
# 预期:drwxr-xr-x 2 user group ... dir1

# 3) 符号链接
ln -s file.txt file.link
ls -l file.link
# 预期:lrwxrwxrwx 1 user group ... file.link -> file.txt

# 4) 命名管道
mkfifo pipe1
ls -l pipe1
# 预期:prw-r--r-- 1 user group ... pipe1

# 5) 设备文件(需 root)
# mknod /tmp/perm_demo/char_dev c 1 3   # 字符设备示例(可能需特权)
# mknod /tmp/perm_demo/block_dev b 8 0  # 块设备示例(可能需特权)

权限模型与校验顺序示例#

# 1) 创建文件并设置权限
echo "hello" > script.sh
chmod 750 script.sh
ls -l script.sh
# 预期:-rwxr-x--- 1 user group ... script.sh

# 2) 解释权限
# 所有者: rwx 可读/写/执行
# 组用户: r-x 可读/执行
# 其他用户: --- 无权限

# 3) 验证执行权限
./script.sh
# 预期:若无 shebang 且不可执行脚本,将提示执行格式错误
# 建议:echo -e '#!/bin/bash\necho ok' > script.sh && chmod 750 script.sh && ./script.sh

目录权限与访问控制示例#

# 准备目录和文件
mkdir -p /tmp/perm_demo/dir2
echo "data" > /tmp/perm_demo/dir2/data.txt

# 设置目录权限:仅允许所有者进入与读写目录项
chmod 700 /tmp/perm_demo/dir2

# 查看目录权限
ls -ld /tmp/perm_demo/dir2
# 预期:drwx------ 2 user group ... dir2

# 注意:
# 目录无 x 权限 -> 无法进入
# 目录无 r 权限 -> 无法列出
# 目录无 w 权限 -> 无法创建/删除文件

常用命令与解释#

# 查看权限与类型
ls -l /tmp/perm_demo
# ls -l: 显示权限、类型、所有者、组、大小、时间

# 查看详细属性
stat /tmp/perm_demo/file.txt
# stat: 显示 inode、权限、访问/修改时间等

# 判断文件类型
file /tmp/perm_demo/pipe1
# file: 识别文件实际类型(文本/管道/设备等)

# 修改权限(符号/数字)
chmod u+rwx,g+rx,o-rwx /tmp/perm_demo/file.txt
chmod 640 /tmp/perm_demo/file.txt

# 修改所有者与组(需 root)
# chown root:root /tmp/perm_demo/file.txt

排错清单(权限相关)#

# 1) Permission denied
# 常见原因:目录缺少 x 权限或文件缺少 r/w/x 权限
namei -l /tmp/perm_demo/dir2/data.txt
# namei -l: 逐级查看路径权限,定位哪一级缺权限

# 2) 执行脚本报错:cannot execute / Exec format error
# 解决:确保脚本首行有 shebang 且具备 x 权限
head -n1 /tmp/perm_demo/script.sh
chmod +x /tmp/perm_demo/script.sh

# 3) 目录可写却无法删除文件
# 原因:删除权限由目录的 w + x 决定,不由文件权限决定
ls -ld /tmp/perm_demo/dir2

练习题#

  1. /tmp/perm_demo 下创建目录 proj,设置权限为 750,并验证:
    - 所有者可进入与创建文件
    - 其他用户无法进入
  2. 创建脚本 run.sh,写入 echo ok,设置为仅所有者可执行,验证执行效果。
  3. 创建命名管道 pipe2,使用 filels -l 分别确认类型。
  4. 使用 stat 输出 file.txt 的权限与 inode,并解释每一项含义。
  5. /tmp/perm_demo 中用通配符列出所有 .log 文件,并分别用绝对路径与相对路径执行。