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
环境准备与验证(无需安装)#
本节不依赖额外软件,仅需常用系统工具:ls、stat、file、touch、mkdir、ln、mkfifo、mknod。
# 检查工具是否存在
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
练习题#
- 在
/tmp/perm_demo下创建目录proj,设置权限为750,并验证:
- 所有者可进入与创建文件
- 其他用户无法进入 - 创建脚本
run.sh,写入echo ok,设置为仅所有者可执行,验证执行效果。 - 创建命名管道
pipe2,使用file与ls -l分别确认类型。 - 使用
stat输出file.txt的权限与 inode,并解释每一项含义。 - 在
/tmp/perm_demo中用通配符列出所有.log文件,并分别用绝对路径与相对路径执行。