linux文件权限深入了解(下)

1.删除文件的权限逻辑

结论:删除文件,看「文件所在父目录」的 w 权限,和文件本身的 w 权限无关

实战验证:

创建目录 + 文件

cpp 复制代码
mkdir test_dir
touch test_dir/file.txt

设置目录权限为 777(所有用户有 w 权限),文件权限 644(其他用户无 w)

cpp 复制代码
chmod 777 test_dir/
chmod 644 test_dir/file.txt

切换为普通用户,执行:

cpp 复制代码
# 能删除文件(父目录有 w)
rm test_dir/file.txt
# 不能编辑文件内容(文件本身无 w)
vim test_dir/file.txt

现象:能删文件,但不能改文件内容。

案例 1:文件只读,父目录权限正常 → 可以删除:
cpp 复制代码
# 创建目录与文件
mkdir dir1
touch dir1/a.txt

# 父目录:rwxr-xr-x(有w、有x);文件:仅只读,无写权限
chmod 755 dir1
chmod 444 dir1/a.txt

# 测试1:修改文件内容 → 失败(文件无w权限)
echo 123 > dir1/a.txt   # Permission denied

# 测试2:删除文件 → 成功(只看父目录w+x)
rm dir1/a.txt
案例 2:文件全开权限,父目录无 w → 无法删除:
cpp 复制代码
mkdir dir2
touch dir2/b.txt

chmod 555 dir2         # 目录 r-x,去掉w权限
chmod 777 dir2/b.txt    # 文件开放所有权限

rm dir2/b.txt           # 报错 Permission denied

案例 3:目录有 w、无 x → 无法删除(缺失准入权限):

cpp 复制代码
mkdir dir3
touch dir3/c.txt

chmod 666 dir3  # 目录 rw-:有w,无x

ls dir3         # 能看到文件名(目录有r权限)
cd dir3         # 无法进入(无x)
rm dir3/c.txt   # 无法删除(无x,不能访问目录条目)

2.默认权限:umask 权限掩码

新建文件 / 目录的默认权限由 umask 决定,系统默认 umask=022。 计算规则:

  1. 目录最大权限 777 - umask = 目录默认权限
  2. 文件最大权限 666(文件默认无执行位) - umask = 文件默认权限

默认 umask 022 计算:

  • 目录:777 - 022 = 755
  • 文件:666 - 022 = 644

和我们日常看到的默认权限完全一致。

查看 / 临时修改掩码:

cpp 复制代码
umask          # 查看当前掩码
umask 007      # 临时修改掩码为 007

3.白名单配置

一开始我们进入自己的服务器上时,一般都是以root(超级用户) 用户登录的。root用户有可以随意查看其他用户的文件的权限。但是其他用户想要root权限的话就需要进行sudo(免密执行命令)这个用户能够执行这个命令的前提是他在服务器的白名单上。

让特定用户无需密码执行 sudo 命令,通过 visudo 编辑安全的 sudo 配置:

cpp 复制代码
# 1. 安全编辑sudoers文件(必须用visudo,避免语法错误)
sudo visudo

# 2. 添加规则(根据需求选一种)
# 方式1:允许user1无密码执行所有命令
user1 ALL=(ALL) NOPASSWD: ALL

# 方式2:仅允许user2无密码执行特定命令(推荐)
user2 ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx, /usr/bin/lsblk

# 3. 保存退出(vi/vim按Esc,输入:wq回车)

4.权限 "一次确认":文件执行的匹配规则

Linux 内核按固定顺序匹配权限,找到第一个匹配项后立即停止检查,不再看后续权限位

1. 核心匹配顺序

内核检查权限时严格遵循以下优先级,匹配即停止

  1. root 用户特权:如果进程 EUID=0(root),直接拥有所有权限,跳过后续检查

  2. 属主匹配 :进程 EUID 与文件所有者 UID 一致 → 仅应用属主 (u) 权限,忽略组和其他权限

  3. 属组匹配 :进程 EGID 或附加组 GID 与文件所属组 GID 一致 → 仅应用属组 (g) 权限,忽略其他权限

  4. 其他匹配 :前两项都不匹配 → 应用其他用户 (o) 权限

cpp 复制代码
# 创建文件,属主alice,属组dev,权限640(u=rw-, g=r--, o=---)
sudo touch test.txt
sudo chown alice:dev test.txt
sudo chmod 640 test.txt

# 用alice用户操作(属主匹配,只看u权限)
su - alice
echo "test" > test.txt  # 成功(u有w权限)
exit

# 用dev组其他用户操作(属组匹配,只看g权限)
su - charlie  # charlie属于dev组
echo "test" > test.txt  # 失败(g无w权限)
cat test.txt    # 成功(g有r权限)
exit

权限匹配的 "不叠加" 原则:

cpp 复制代码
# 创建文件,权限u=r--, g=rwx, o=---
touch test2.txt
chmod 470 test2.txt

# 用文件所有者操作(只看u权限,即使g权限更开放)
cat test2.txt    # 成功(u有r)
echo "123" > test2.txt  # 失败(u无w)
./test2.txt      # 失败(u无x)

谢谢

相关推荐
Zh&&Li2 小时前
保姆级安装AI全自动渗透工具(pentestswarm)
linux·运维·服务器·人工智能
木雷坞2 小时前
Playwright MCP Docker 部署:mcr 镜像、浏览器工具和权限配置
运维·docker·容器·mcp
骑士雄师2 小时前
17.2 通过 Config 传入用户名 → 工具1存入 State → 工具2读取 State 并返回答案
服务器·windows·microsoft
das2m2 小时前
WSL2 Ubuntu 配置完美版 docker compose 指南
linux·ubuntu·docker
江湖有缘2 小时前
Docker一键部署open-resume简历生成器
运维·docker·容器
丑过三八线2 小时前
Runc 深度解析:从原理到实操
java·linux·开发语言·docker·容器·rpc
沉在嵌入式的鱼2 小时前
Jetson系列集成第三方库和应用程序到镜像方案
运维·服务器
手可摘星辰的少年2 小时前
Linux字符设备驱动的实现与QEMU验证
linux
手可摘星辰的少年2 小时前
使用额外ext4磁盘镜像在QEMU中传递与加载内核模块
linux