过去四天你学了权限位、属主属组、用户管理、sudo。但知识点是散的。今天把它们串成一条遇到问题时能照着走的排查链。
先把链条理出来
这就是你以后的思考顺序
看到 Permission denied,按这个顺序问自己
- 1 · 我是谁
id—— 当前用户是谁,在哪些组里。不知道自己是谁,权限位看了也没用。- 2 · 它是谁的
ls -l—— 文件的属主、属组是谁,权限位是什么。- 3 · 我算哪一组
- 是属主?在属组里?还是其他人?从左到右命中即停,用对应那三位。
- 4 · 路径上每一层都进得去吗
- 文件权限对了也可能被拦——父目录缺 x 就进不去。用
namei -l 路径一次看完整条路径。 - 5 · 是不是 SELinux
- 前四步都对却还是被拒,看
ls -Z。第 19 天详讲。
第 4 步那个命令值得记
namei -l /a/b/c/file 会把路径上每一层的权限都列出来——一眼看出是哪一级挡住了你。
比一层层 ls -ld 快多了,但知道的人不多。
实验一:文件权限不足
最基础的一种
制造故障
$ echo "secret content" | sudo tee /tmp/secret.txt
$ sudo chmod 600 /tmp/secret.txt
$ sudo chown root:root /tmp/secret.txt
# 切到普通用户去读
$ su - test01
$ cat /tmp/secret.txt
cat: /tmp/secret.txt: Permission denied
按链条排查
$ id
uid=1001(test01) groups=1001(test01)
↑ 我是 test01,不在任何特殊组里
$ ls -l /tmp/secret.txt
-rw-------. 1 root root 15 Sep 7 15:00 /tmp/secret.txt
↑ 属主 root、属组 root、权限 600
# 我不是 root,也不在 root 组 → 我算「其他人」
# 其他人那三位是 --- → 一点权限都没有。找到原因了。
怎么修?回想 Day 07 的原则:优先精确授权,而不是把门全开。
两种改法,选哪个
# ❌ 偷懒:所有人都能读写
$ sudo chmod 777 /tmp/secret.txt
# ✅ 精确:把属组改成 test01,只给组读权限
$ sudo chgrp test01 /tmp/secret.txt
$ sudo chmod 640 /tmp/secret.txt
↑ 属主可读写、组可读、其他人不行
实验二:目录缺 x
Day 06 那个坑,亲手踩一次
制造故障
$ sudo mkdir -p /tmp/vault
$ echo "hello" | sudo tee /tmp/vault/data.txt
$ sudo chmod 777 /tmp/vault/data.txt ← 文件本身权限全开!
$ sudo chmod 644 /tmp/vault ← 但目录没有 x
$ su - test01
$ cat /tmp/vault/data.txt
cat: /tmp/vault/data.txt: Permission denied
这就是那个坑
文件是 777,谁都能读——但你连门都进不去。
目录的 x 是「进入」权限,没有它,里面的东西一律访问不到,文件自己什么权限都白搭。
用 namei 一眼看穿
$ namei -l /tmp/vault/data.txt
f: /tmp/vault/data.txt
drwxrwxrwt root root /tmp
drw-r--r-- root root vault ← 这一层没有 x,卡在这
-rwxrwxrwx root root data.txt
$ sudo chmod 755 /tmp/vault # 修好
实验三:脚本没有执行权限
第 26 天写脚本前的预防针
制造 + 排查 + 修复
$ echo -e '#!/bin/bash\necho hello' > /tmp/lab/hi.sh
$ ./tmp/lab/hi.sh
bash: ./tmp/lab/hi.sh: Permission denied
$ ls -l /tmp/lab/hi.sh
-rw-r--r--. 1 devops devops 25 Sep 7 15:10 hi.sh
↑ 我是属主,但属主那三位是 rw-,没有 x
$ chmod +x /tmp/lab/hi.sh # 加执行权限
$ /tmp/lab/hi.sh
hello
新建的脚本默认没有 x(Day 06 讲的 umask 决定的,文件默认 644)。写完脚本第一件事就是 chmod +x——这个第 26 天你会重复很多次。
第二周,你已经会了这些
回头看一眼
Week 02 · 权限和用户 —— 五天的收获
- Day 06
- 三组权限、rwx 对文件和目录的不同含义、755/644、目录的 x 是进入权限。
- Day 07
- 属主属组、
chown、403 的三层排查顺序、精确授权优于放开权限。 - Day 08
- 用户管理、passwd/shadow 三个文件、
-aG那个 a 的事故、离职先锁后删。 - Day 09
- sudo 的两个理由、
visudo为什么不能用 vi、精确授权、审计日志。 - Day 10
- 把上面全部串成一条能照着走的排查链。
把这周串成一段面试回答
这才是真正的产出
「遇到 Permission denied,你怎么排查?」
「我的顺序是:id 先确认当前用户是谁、在哪些组;然后 ls -l 看文件属主属组和权限位,判断自己算属主、属组还是其他人;如果文件本身没问题,再看路径上每一层目录有没有 x——父目录缺 x 的话里面什么都访问不了,我一般用 namei -l 一次看完整条路径;都对了还不行,那就查 SELinux。」
「修的时候优先用 chown/chgrp 精确授权,不用 777。」
这段话里有顺序、有工具、有判断依据、还有价值观(不用 777)。把它练到能顺口说出来,这周就没白学。
今天的动手实验
全部自己做一遍 · 约 15 分钟
- 先建个测试用户:
sudo useradd -m test01 && sudo passwd test01 - 实验一:按上面的步骤造出文件权限故障,然后不看答案,自己用
id+ls -l分析出原因 - 实验二:造出「文件 777 但目录没 x」的情况,亲眼看它怎么拒绝你
- 用
namei -l /tmp/vault/data.txt看整条路径,找出是哪一层卡住的 - 实验三:写个脚本,不加 x 直接跑,看报错,再
chmod +x跑通 - 清理:
sudo userdel -r test01,sudo rm -rf /tmp/vault /tmp/secret.txt - 最后:合上页面,把上面那段面试回答说出声一遍
下周预告
Week 03 讲服务和进程——systemctl、journalctl,还有第 14 天那个「自己搞坏 nginx 再修好」的实战,那是整个计划里最有价值的一天。