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。 计算规则:
- 目录最大权限
777- umask = 目录默认权限 - 文件最大权限
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. 核心匹配顺序
内核检查权限时严格遵循以下优先级,匹配即停止:
-
root 用户特权:如果进程 EUID=0(root),直接拥有所有权限,跳过后续检查
-
属主匹配 :进程 EUID 与文件所有者 UID 一致 → 仅应用属主 (u) 权限,忽略组和其他权限
-
属组匹配 :进程 EGID 或附加组 GID 与文件所属组 GID 一致 → 仅应用属组 (g) 权限,忽略其他权限
-
其他匹配 :前两项都不匹配 → 应用其他用户 (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)
谢谢