跳转至

Linux 拷问实录(一):五道题,两个坑

12 课结业之后,我怕的是那种"看着都会、一动手就废"的假会。所以没急着学新东西,先把自己考了一遍。

考法很硬:一次只出一题,答完才给下一题;答对了不许松气,紧接着往深里追问一个;答错了当场纠正,还要说清依据。五道题从"列出目录里有什么"一路问到"网站打不开了你怎么查"。

结果五题全对,但换出两个真盲点——都是知道原理、栽在细节的那种。

第一题:把藏起来的文件也翻出来

题面:人在家目录,要列出 wiki 里的全部文件(含隐藏)、带大小、大小还得看得懂。

我答:

ls -lAh /home/admin/wiki

拆开是三件事:-l 出长格式(大小、时间、权限),-A 把隐藏文件也列上,-h 把 11264 变成 11K。

考官指出亮点在 -A:一般人会写 -a,但 -a 会多塞 .(当前目录)和 ..(上级目录)两行没用的东西;-A(almost all)把这两个省掉。

这条不是"少两行"那么简单:

ls -lh  /home/admin/wiki   # 输出里没有 .venv,也没有 .cache
ls -lAh /home/admin/wiki   # .venv 在,228M

.venv 是整个 wiki 目录里最大的东西(228M),可它名字以点开头。查磁盘占用时漏掉它,会得出"这个目录很干净"的完全错误结论。

第二题:为什么这个目录只占 4.0K

题面承接上一题:docs 目录里装着二十几个文件、加起来几百 KB,可 ls -l 那行显示 4.0K。这个数字是什么?

我答:是目录本身的大小,想知道真实占用得用 du -sh。

机制值得写下来——Linux 里目录也是一种文件,它的内容就是一张"文件名 → inode 号"的对照表。像档案柜门口的索引卡:抽屉里放了多少纸,跟卡片本身多大没有关系;除非卡片多到贴满一整块板子,才会再拿一块。

实测(往一个目录里塞空文件,只看目录那一行):

目录里有几个文件 ls -ld 显示
空 4096
100 个 4096
300 个 12288
800 个 20480
3000 个 73728

稳稳地按 4K 一块往上长。所以 docs 那行永远是 4096,而 du -sh 给的是 240K(27 个 md 文件,每个不满 4K 也各占一整块)。

记住:看房间多大用 du,ls 那个数字永远骗你。

第三题:找出最占地方的前三名

题面:列出 /home/admin/wiki 下最占地方的前三名。

我答:

find /home/admin/wiki -mindepth 1 -maxdepth 1 -exec du -sh {} + | sort -h | tail -n 3

考官说这写法比教科书答案更严谨,三个地方都对:

用 find 而不是 *,这一条直接决定对错:

# 我的写法        → 40K sketches / 240K docs / 228M .venv
# 通配符 du -sh wiki/*  → 16K overrides / 40K sketches / 240K docs   ← 漏掉 .venv

通配符 * 默认不匹配隐藏文件。用 * 的话,第一名会被算成 docs(240K)——而真相是 .venv 有 228M,是它的近一千倍。第一题学到的教训,在这里直接决定了答案对不对。

sort -h 不能写成 sort -n:-n 只认数字,会认为 240K > 228M(它在比 240 和 228);-h 才懂 K/M/G 单位。

-exec ... {} + 里的 + 是批量传参,比逐个调用的 \; 高效;加上 -mindepth 1 -maxdepth 1,精确框住"只看这一层"。

第四题:750 挡住了谁

题面是个真场景:

drwxr-x--- 2 nginx nginx 4096  /srv/uploads/kb/QhQ_koOU/files

这个上传落盘目录属主是 nginx:nginx、权限 750,而日常干活用的 admin 账号既不是属主,也不在 nginx 组里。问:admin 去 ls 会怎样、为什么、怎么最小改动地放开。

前两问答得干脆:打不开,连列都列不了。因为 admin 既不是 owner 也没有 group,只能落到第三段 others,而 others 是 ---。目录的 x 位是"能不能迈进这道门",门直接焊死。

实测原文:

ls: cannot open directory '.../files': Permission denied

第三问,我答了 setfacl:

sudo setfacl -m u:admin:r-x /srv/uploads/kb/QhQ_koOU/files

考官说这是超纲答案、方向也对:不改属主、不动组、不开 others,只给 admin 一个人加权限,这才是"最小改动"的本意。大多数人会答 chmod 755——那等于把门开给全世界,属自毁门禁。

但两处落地细节被扣住了。

一是这机器上根本没装 acl 工具包:command -v setfacl 什么都没有,真要跑得先 sudo dnf install acl。(文件系统本身支持:Default mount options: user_xattr acl。)

二是目录的 ACL 只管目录,管子里的文件不认。上传落盘的文件权限由 nginx 那条 dav_access user:rw group:r 决定,也就是 640——others 段还是 ---。所以就算给目录加了 admin 的 r-x,能列目录了,打开文件照样 Permission denied,除非加 -R 递归处理。

一步到位的做法其实是:

sudo usermod -aG nginx admin

把 admin 加进 nginx 组,同时打通两层:目录 750 的 group 段给 r-x(能进),文件 640 的 group 段给 r--(能读)。不用装东西,不动任何权限位。代价是顺带获得 nginx 组的全部权限,而且得重新登录才生效。

第五题:网站打不开了,你怎么查

我给了六步,从外往里剥:

  1. 快速体检:uptime && free -m && df -h && systemctl --failed——先排除磁盘满、服务挂
  2. systemctl status nginx——服务自己活没活
  3. ss -tlnp | grep -E ':(80|443)'——端口有没有在听
  4. curl -I http://127.0.0.1——本机自测
  5. firewall-cmd --list-ports——防火墙
  6. sudo tail -n 50 /var/log/nginx/error.log——最后看日志

框架考官认了,但第 4、5、6 步各被补了一刀,全是实战里才会疼的细节。

坑一:本机自测不带 Host 头,它会骗你

第 4 步我敲的是 curl -I http://127.0.0.1。实测:

curl -I http://127.0.0.1                       →  404 Not Found
curl -I -H "Host: wuyao.fun" http://127.0.0.1  →  301 Moved Permanently
curl -I https://wuyao.fun/wiki/                →  200 OK

站是好的,可裸敲 127.0.0.1 拿到的是 404。因为 nginx 按域名分发,请求带的 Host 是 127.0.0.1,没匹配上 wuyao.fun,落到了默认 server 块——那个 404 跟这个网站一毛钱关系都没有。

真出故障时,这条命令会把人领到完全错误的方向上查半天。本机自测要么带 Host 头,要么直接走真实域名。

坑二:门有两道,机器里一道,机器外一道

第 5 步查防火墙,我只记着机器里的 firewalld,忘了阿里云 ECS 外面还有一道安全组——那是在控制台配的,机器上完全看不见。机器里门全开、安全组没放行 443,外面照样进不来,而你在机器里怎么查都是"一切正常"。

顺带一个:日志别只看一半

error.log 只告诉你"报了什么错"。真正决定往哪查的是 access.log:

  • access.log 有新的请求行 → 请求进来了 → 去 error.log 找原因
  • access.log 一片死寂 → 请求根本没到 → 回头查网络、DNS、安全组,别在 nginx 里瞎转

先用"里面还是外面"把范围砍一半,比任何具体命令都值钱。

自评

过关的部分:

  • 命令选项的讲究是够的:-A 而不是 -a、find 而不是 *、sort -h 而不是 -n——这三处都是知道为什么才会这么写
  • 权限的三段逻辑真的通了,还能自己想到课程没教过的 setfacl
  • 排错的顺序感对:体检 → 服务 → 端口 → 自测 → 防火墙 → 日志

薄弱的地方集中在落地细节,不是概念:

  1. 本机自测没考虑 Host 头 → 会误判故障位置
  2. 只想到机器里的门,忘了外面的安全组
  3. "知道但没装":setfacl 方向对,可这机器上没这命令
  4. 日志只看一半,忘了用 access.log 判断"有没有人进来"

两条补课,就两条:

  • 动手前先探路:command -v <工具> 花一秒确认东西在不在,比敲完报 command not found 再回头强
  • 排错先定位内外:外网 curl 一次 + 本机带 Host curl 一次,两步把故障圈进"网络"还是"服务"

下一篇:想被考操作系统里"看不见的东西"——进程与信号。什么进程在偷偷占资源、kill 到底发给谁、为什么有的进程杀不掉。