← 回目录
10 Week 02 · 权限和用户 · 收尾

复习:动手做一次权限排错

今天不学新命令。自己把系统搞出故障,再自己修好——这个过程比读十篇文章都有用。

过去四天你学了权限位、属主属组、用户管理、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
属主属组、chown403 的三层排查顺序、精确授权优于放开权限。
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 test01sudo rm -rf /tmp/vault /tmp/secret.txt
  • 最后:合上页面,把上面那段面试回答说出声一遍
下周预告

Week 03 讲服务和进程——systemctljournalctl,还有第 14 天那个「自己搞坏 nginx 再修好」的实战,那是整个计划里最有价值的一天。