授权与合规声明
本文全部操作对象均为自建隔离靶场(本机容器或隔离虚拟机),涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款,须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离,不含任何攻击步骤、利用载荷与绕过手法,请勿将文中环境指向任何非自有系统。
一、rm敲下去之后,"删掉了"到底指什么
1.1 四个几乎人人都碰过的场景
在隔离靶机里练手的人,对下面这四件事大概都不陌生。
第一件:你把一个文件删了,过一会儿想起来还要用,去回收站里翻,里面没有它。
第二件:你把一个长得很快的日志文件删了,ls再看那个目录确实没有它了,可磁盘剩余空间那个数字几乎没动。
第三件:有个程序一直在往一个日志文件里写东西,你把那个文件删了,它并没有停下来。
第四件:你把一个文件发给同学,然后把自己机器上这一份删了;对方手里那份完好无损。
**"删掉了"在我们嘴里是一件事,在系统这一层却是两件事:名字没了,和内容没了。**两件事多数时候一起发生,但不是必然一起发生——本文讲的就是它们什么时候分开。
1.2 官方在rm的手册页里,把"删除"写成了 unlink
先说一个很容易被顺手忽略的细节。
rm手册页最上面的 NAME 那一行是(逐字引文见附表 A 第 1 行):
NAME: rm - remove files or directories
它说的是"删除文件或目录"。到了选项说明部分,第一句是(逐字引文见附表 A 第 2 行):
Remove (unlink) the FILE(s).
括号里那个 unlink 值得停一下:手册页没有把"删除"解释成"抹掉"“清空”,而是给了一个同义的系统动作名。官方讲这个命令做什么,用的词是"解除链接"。
为什么这个词重要,unlink(2)手册页的标题说得更直接(逐字引文见附表 A 第 8 行):
NAME: unlink, unlinkat - delete a name and possibly the file it refers to
逐字读这一行:删掉一个名字,并且可能删掉这个名字所指的那个文件。
那句话里有两处要注意:delete aname说明被删掉的那个东西,官方称之为"名字";possibly说明是否连带删掉文件本身,官方用的是"可能",不是"一定"。
这就是本文的钥匙:rm作用在名字上,落到内容上的结果是"可能"。
1.3 这一层不碰什么
为了不让后面的讨论跑偏,先把边界划出来。
第一,本文不碰"怎么把文件找回来"。官方在rm手册页里确实提到过恢复的可能性,本文会在第六章照抄那句话,但任何恢复手法、工具与命令,一个字都不写。
第二,本文不碰"哪些进程开着哪个文件、怎么查"。第四章会讲"有进程还开着它"这个条件,但只做现象描述,不给排查方法。
第三,本文不碰权限("这个名字你能不能删掉"取决于它所在的目录),也不碰整块磁盘的占用定位——本文讨论的是单个文件这一层:删除这个动作,在名字和内容上分别做了什么。
把这一层的两个问题并排写下来:
⚠️代码待验证
【"删掉了"这个词,被用来问两件不同的事】 问题一:这个名字还在不在? -> 目录里还能不能列出它(这一层,名字先走) 问题二:它占的那块地方回来了没有? -> 空间能不能被别的文件重新用(要看条件,不一定跟着走) 两个问题的答案,不一定同时是"没了"。| 你嘴里的说法 | 它其实在问什么 | 本文怎么处理 |
|---|---|---|
| “文件删掉了” | 名字没了,还是内容没了? | 拆成两个问题分别看 |
| “删了就找不到了” | 还能不能按名字访问到它 | 名字被删,按名字自然找不到 |
| “空间没释放” | 内容是不是还占着地方 | 要看第四章那个条件 |
| “对方那边还有” | 副本算不算同一份 | 副本各自是独立的一份 |
这张表里第二、三行是重点:它们看着像同一个问题的两种说法,其实是两个问题——前者只动名字,后者要看条件。
二、被删掉的是名字:名字与内容不是一回事
2.1 目录里列出来的,是名字
先建立两个词。你在终端里看到的那个字符串——比如一个文件名——在这一层叫名字(name)。名字背后,是这份数据本身,以及系统为了管理它另外记下的一些信息。两者不在同一个位置上:名字挂在它所在的那个目录里,文件本身由系统另外记账。官方在unlink(2)的标题里就用 a name 和 the file it refers to 这两个词把它们分开说了(附表 A 第 8 行)。
2.2rm说"文件",落到系统调用这一层说"名字"
有人会问:rm手册页说的是 remove files,这不就是"删文件"吗?
rm手册页里确实有这么一句(逐字引文见附表 A 第 3 行):
This manual page documents the GNU version of rm. rm removes each specified file. By default, it does not remove directories.
中文:这份手册页记录的是 GNU 版本的rm;rm会删掉每一个被指定的文件,默认情况下它不删目录。
这句话里有一件实用的事:rm默认不删目录——所以删目录要另外的开关。另一个是"rmremoves each specified file"这个说法本身。
两个说法并不打架。rm是你手里用的那个命令,描述"你让它删什么";"删"这个动作落到系统调用这一层,官方给的名字是 unlink。命令层说"删文件",实现层说"删名字"。
顺带记两个实际的坑,同样出自rm手册页(逐字引文见附表 A 第 5、6 行):
Any attempt to remove a file whose last file name component is ‘.’ or ‘…’ is rejected with a diagnostic.
To remove a file whose name starts with a ‘-’, for example ‘-foo’, use one of these commands:
第一句:想把名字的最后一段写成.或..来删,会被拒绝。第二句:名字以短横线开头的文件,直接照着写会被当成选项来读,官方给的写法是把分隔符摆出来。两条都写在"名字"这一层上——你操作的对象,自始至终是那个名字。
2.3 名字可以不止一个
再看官方那句话里的一个用词。unlink(2)说,如果这个 name 是该文件的the last link——最后一个链接——才会走到"文件被删除"那一步(附表 A 第 9 行)。
用"最后一个"来限定,说明同一个文件可以被不止一个名字指向:删掉其中某一个名字,文件本身并不会随之消失。
关于链接本身怎么建立、怎么用,是另一篇文章的范围,本文不展开。这里只取一个结论:官方判断"这个文件还有没有人要"时,数的是名字的个数,而不是内容还在不在。
⚠️代码待验证
# 先建一个专门用来演示的目录,再往里放一个演示文件mkdir-p/tmp/del-demoprintf'demo line\n'>/tmp/del-demo/demo.txt# 看目录里列出来的东西:它是一串字符ls-l/tmp/del-demo# 再看这条记录在元信息里还能展开成什么stat/tmp/del-demo/demo.txt上面这几条动作全部在本文自己建的/tmp/del-demo/里,不碰别处。本文不贴这些动作的实际输出:本机未实测,而且不同系统上的字段排布并不一样。
| 名字(name) | 名字指向的那份东西 | |
|---|---|---|
| 它挂在哪 | 它所在的那个目录里 | 由系统另外记账 |
rm动了哪个 | 删掉的就是它 | 要看条件(第三、四章) |
| 怎么访问到 | 靠这个名字找到它 | 没有名字时,按名字就找不到 |
| 能否有多个 | 可以不止一个 | 名字的个数变了,东西不一定跟着没 |
三、内容什么时候真的消失:官方给的两个条件
3.1 两个条件写在同一句里
unlink(2)手册页里,紧挨着标题的那句是本文最该逐字读的一句(逐字引文见附表 A 第 9 行):
unlink() deletes a name from the filesystem. If that name was the last link to a file and no processes have the file open, the file is deleted and the space it was using is made available for reuse.
拆成两半来读。前半句是无条件的:unlink()会把一个名字从文件系统里删掉。后半句是有条件的:如果"这个名字是该文件的最后一个链接"和"没有任何进程开着这个文件"同时成立,那么文件被删除,它占用的空间被标记为可以再次使用。
条件有两个,中间用的是 and:两个都成立,才走到"文件被删除、空间被回收"。
3.2 "空间被回收"这句话挂在哪一半
初学者最容易读漏的是后半句的结构。
官方那句的主干是"如果 A 和 B,那么——文件被删除,并且它占用的空间被标记为可再次使用":两件事被并列写在同一个结论里,共享同一个前提。它不是"名字删了,空间就顺手回来了",而是"两个条件都满足时,文件被删除,空间才回得来"。
这解释了第一章里的第二件事:日志文件的名字确实没了,可空间没动。"名字被删掉"和"空间回来"本来就不是同一步。
⚠️代码待验证
# 在演示目录里走一遍"删掉一个名字"的过程,每一步之间都能停下来看mkdir-p/tmp/del-demoprintf'demo line\n'>/tmp/del-demo/demo.txtls-l/tmp/del-demo# 删除时打开交互询问:每删一个都先问一次rm-i/tmp/del-demo/demo.txt# 再列一次,确认名字已经不在了ls-l/tmp/del-demo关于最后那个开关:rm手册页对-i的说明是(逐字引文见附表 A 第 7 行):
prompt before every removal
中文:每次删除之前都问一次。它只改变"删之前问不问",不改变删除这件事的性质。这个演示请你自己动手敲一遍,并且只在这个目录里用。
还有一点要提醒:rm默认不删目录(附表 A 第 3 行)。上面这段演示里被删的只有一个普通文件,没有目录。
3.3 判断这一步,其实只问两句话
把官方那两个条件改写成人话,就是两句:除了我刚删的这个名字,还有别的名字指着它吗?现在有没有哪个进程还开着它?两句的答案都是"没有",才轮到"文件被删除、空间被释放"。只要有任何一个答案是"还有",那被删掉的就只是这个名字。
| 是最后一个名字吗 | 有进程还开着它吗 | 官方口径下会发生什么 |
|---|---|---|
| 是 | 没有 | 文件被删除,空间被标记为可再次使用 |
| 是 | 有 | 名字没了;文件一直存在到最后一个描述符被关闭(第四章) |
| 不是 | 没有 | 少了一个名字;文件还在,靠别的名字照常访问 |
| 不是 | 有 | 少了一个名字;文件还在,并且还开着 |
最需要记住的是第二行,它对应第一章里的第二、第三件事,下一章专门讲它。
四、还有进程开着它:两个让人困惑的现象
4.1 官方那句"一直存在到最后一个描述符被关闭"
接着上面第二行。unlink(2)手册页的下一句是(逐字引文见附表 A 第 10 行):
If the name was the last link to a file but any processes still have the file open, the file will remain in existence until the last file descriptor referring to it is closed.
中文:如果这个名字是该文件的最后一个链接,但有进程仍然把这个文件开着,那么这个文件会一直存在,直到指向它的最后一个文件描述符被关闭。
先把"描述符"这个词说清楚:一个程序要用一个文件,得先"打开"它;打开这个动作会交回给程序一个凭据,程序之后靠它来读、来写。凭据和文件的名字是两回事:名字是给人用、给目录用的,凭据是程序拿在手里的。
于是那句话的意思就是:名字可以已经没了,但只要还有程序握着凭据,系统就不把这个文件真正收走,要等到最后一个凭据被关掉才做那一步。
4.2 两个现象因此是同一句话的两个面
现在回头看第一章里的第二件和第三件事,其实是同一句话结出的两个果。
第一件——空间没回来。名字虽然删了,还有程序开着它,文件没被真正收走,空间自然也没被标记为可用。
第二件——程序还在往一个"已经被删掉"的文件里写东西。这里有个容易打滑的地方:程序压根不是"按名字找到那个文件"再写的,它用的是手里那个凭据。名字在不在,对它正在做的这件事没有影响,所以它看起来毫无察觉,继续写下去。
"删掉了"这句话是从"名字"这个角度说的。站在程序的角度,它手里那份东西还在。
| 你看到的现象 | 站在哪一层的看法 | 官方口径对应哪一句 |
|---|---|---|
| 名字还在目录里 | 名字这一层 | 名字没被删 |
| 名字没了、空间也没释放 | 内容这一层 | 还有进程开着它,文件一直存在 |
| 程序继续往"已删除"的文件里写 | 程序手里那个凭据这一层 | 同上:凭据还没被关闭 |
| 名字没了、空间也回来了 | 两个条件都满足 | 文件被删除,空间可再次使用 |
4.3 本文只描述现象,不给排查手段
这一章讲到"有进程还开着它"就停住。至于"到底是哪个进程开着它、怎么把它找出来",本文不给方法——那属于另一个范围,本文不写命令,也不给命令的组合用法。
本章希望你带走的是一句判断:**当"文件已经删了、可空间没回来"时,先想一下是不是还有程序握着它,而不是先去怀疑磁盘出了问题。**这个念头,比任何一条查询命令都更该先建立起来。
⚠️代码待验证
【两种现象的同一个解释】 名字:删掉了 ──┐ ├── 还有程序握着"打开"的凭据 文件:没被收走 ──┘ ├─ 现象一:空间没回来(文件还占着) └─ 现象二:程序还能继续写(它用的是凭据,不是名字) 凭据全部关闭之后,才轮到:文件被删除,空间可再次使用。五、删的不总是"内容":不同对象,删掉的东西不一样
5.1 软链接:删掉的是链接本身
前面几章讲的是普通文件。unlink(2)手册页还交代了另外几类对象在同一个动作下的表现。第一类是软链接,官方口径是(逐字引文见附表 A 第 11 行):
If the name referred to a symbolic link, the link is removed.
中文:如果这个名字指向的是一个软链接,被删掉的是这个链接。
请注意它没有说"链接指向的那个文件也被删掉",只说 the link is removed——被移走的是链接这一个东西,这与前面的说法一致。
5.2 socket、FIFO、设备:名字没了,对象可能还在被用
第二类是几类"不是装数据的普通文件"的对象。官方把它们的表现写在同一条里(逐字引文见附表 A 第 12 行):
If the name referred to a socket, FIFO, or device, the name for it is removed but processes which have the object open may continue to use it.
中文:如果这个名字指向的是一个 socket、一个 FIFO,或者一个设备,那么它的名字会被删掉,但已经把这个对象打开着的进程,可能继续使用它。
逐字看这一句:前半句是干脆的——名字会被删掉;后半句用的是 may continue to use it——可能继续使用。名字在不在,和"已打开的进程还能不能接着用",是两件事。
边界:socket、FIFO、设备各自是干什么用的、怎么创建,本文不展开;只取这一条——名字被删掉之后,已经打开它们的进程可能不受影响。
5.3 一张表,和一份配套资料
| 被删的名字指向什么 | 官方口径下删掉的是什么 | 已经打开它的进程会怎样 |
|---|---|---|
| 普通文件(是最后一个名字) | 文件被删除,空间可再次使用 | 没有进程开着它时才走到这一步 |
| 普通文件(终端里已经打开) | 名字没了,文件一直存在 | 一直撑到最后一个描述符被关闭 |
| 软链接 | 链接被移走 | 官方这一条里未涉及 |
| socket / FIFO / 设备 | 名字被删掉 | 可能继续使用 |
最后一行那句"可能",是整张表里唯一一处官方没给"一定"的地方;本文照抄这个"可能",不把它读成"一定"。
配套资料:把本章这张表、第三章那两个条件和第四章那两种现象并到一起,做成一份删除语义速查卡,放在资料包里,扫码即可获取:
六、官方自己承认:删除不是擦除
6.1rm手册页里那句老实话
前面五章讲的是"删的是名字"。到这里要问最后一个问题:名字删了、条件也满足了、空间被标成可再用了,那份内容是不是就"没了"?
rm手册页里有一段最该认真读(逐字引文见附表 A 第 4 行):
If you use rm to remove a file, it might be possible to recover some of its contents, given sufficient expertise and/or time. For greater assurance that the contents are unrecoverable, consider using shred(1).
中文:如果用rm删掉了一个文件,在具备足够的技术条件和/或时间的前提下,有可能恢复它的一部分内容。如果希望更有把握让内容不可恢复,官方建议考虑shred这个命令。
这句说得很有分寸:用的是 it might be possible to recoversome ofits contents——“有可能恢复其中一部分内容”。它没有说"一定能恢复",也没有说"一定能恢复全部",承认的是一件更朴素的事:rm这个动作,官方自己并不认为等同于"内容不可恢复"。
⚠️代码待验证
【删除与擦除,在官方口径里是两件事】 删除(unlink):动的是名字这一层 官方标题:delete a name and possibly the file it refers to 官方说明:删除过的文件,在足够技术条件与时间下,可能恢复出部分内容 擦除(覆盖):动的是内容本身 官方的说法是"反复覆盖",目的是让恢复变得更难 但紧接着还有一条 CAUTION,见下一节 两件事解决的不是同一个问题。6.2 官方点名的那一个,以及它自己的 CAUTION
rm手册页提到的是shred。它的手册页 NAME 那一行是(逐字引文见附表 A 第 13 行):
NAME: shred - overwrite a file to hide its contents, and optionally delete it
中文:覆盖一个文件以隐藏它的内容,并可选地在之后删除它。它做的事,下一句说得更清楚(逐字引文见附表 A 第 14 行):
Overwrite the specified FILE(s) repeatedly, in order to make it harder for even very expensive hardware probing to recover the data.
中文:反复覆盖指定的文件,目的是让恢复变得更难——难到连成本很高的硬件探测手段也不容易做到。
这句话里有两处用词值得留意:repeatedly说明它做的是反复覆盖,不是一次性动作;make it harder说明它的目的是"让恢复变得更难",而不是"让恢复变成不可能"。
而且,官方紧跟着自己给了一条警告(逐字引文见附表 A 第 15 行):
CAUTION: shred assumes the file system and hardware overwrite data in place. Although this is common, many platforms operate otherwise. Also, backups and mirrors may contain unremovable copies that will let a shredded file be recovered later.
这段值得逐句读。第一句:它有一个前提假设——假设文件系统和硬件"在原地覆盖"数据。第二句:这种情形虽然常见,但很多平台并不是这么工作的。第三句:备份和镜像里可能存在删不掉的副本,会让一个已经被覆盖过的文件在之后被恢复出来。
三层连起来:它的效果依赖一个不一定成立的前提,它也没法管到"别处还有一份"。
6.3 所以,"删除"和"擦除"要分开说
把这一章压成一句话:在官方口径里,“删除"和"擦除"不是同一件事,也不是程度上的"轻一点"和"重一点”。
- 删除(unlink)动的是名字这一层,官方自己说删除过的内容"可能"还能恢复出部分;
- 擦除(覆盖)动的是内容本身,官方对它的说明止于"让恢复变得更难",还附了一条前提与副本问题的警告。
删除(rm/ unlink) | 擦除(官方点名的那个命令) | |
|---|---|---|
| 动的是哪一层 | 名字 | 内容本身 |
| 官方描述里的动词 | delete a name … possibly the file | overwrite … repeatedly |
| 官方对结果的措辞 | 可能恢复出部分内容 | 让恢复变得更难(harder) |
| 官方给没给"一定" | 没有 | 没有,还附了一条 CAUTION |
| 有没有前提假设 | 没有交代 | 假设文件系统与硬件"原地覆盖" |
| 管得到副本吗 | 不涉及 | 官方明说备份与镜像里可能有删不掉的副本 |
还有一条边界必须交代清楚:本文不教任何数据恢复手法——不介绍工具,不给命令,不提网站。上面出现的那个命令名,是官方在rm手册页里自己点出来的,本文照抄它、并照抄它自己的警告;它的可用写法,本文一律不给。
至于"把一个文件发给别人之后,本机删了会怎样"——官方那条 CAUTION 里说的"备份和镜像里可能有删不掉的副本",讲的就是这一类情形:你删的是你手里这一份,副本各自是独立的一份。
七、把这一层变成动作
7.1 一份可以对着用的自检表
前面六章讲的是原理,这里压成一张可以对着用的表,每一条都是"先想一想"。
⚠️代码待验证
【删除这一层的自检表 · 先想再看】 1. 我说"删掉了",问的是哪一件事? -> "名字还在不在",还是"空间回来没有"?这是两个问题 2. 这个名字是不是指向它的最后一个? -> 官方判断用的是"最后一个链接" 3. 现在有没有程序还开着它? -> 有的话,文件会一直存在到最后一个描述符被关闭 4. 空间没回来,先想到"还有程序握着它"了吗? -> 先想这个,再想别的 5. 我删的是不是一个软链接,或者 socket / FIFO / 设备? -> 软链接:被移走的是链接本身;后三类:名字被删,已打开的进程"可能"继续使用 6. 我是不是把"删除"当成"擦除"了? -> 官方自己说,删除过的内容"可能"能恢复出部分;覆盖也未必管得到副本7.2 三条可以带走的动作
- **把"删掉了"拆成两个问题来问。**名字还在不在,和空间回来没有,是这一层的两个问题,答案不一定同时是"没了"。
- **遇到"空间没回来",先想到"还有程序握着它"。**官方那句话就是为这个现象写的——文件会一直存在,直到最后一个描述符被关闭。
- **不要把"删除"当成"擦除"。**官方自己在
rm手册页里承认删除过的内容"可能"能被恢复出部分,这是这一层最该记住的一条分寸。
7.3 这份清单不覆盖什么
第一,**它不教任何恢复手法。**本文从头到尾不给恢复的工具、命令与方法。
第二,**它不给"怎么查是哪个进程开着它"的方法。**第四章只做现象描述,排查动作不在本文范围。
第三,**它不展开链接本身。**官方判断时数的是名字的个数;链接怎么建立、怎么使用,属于另一层。
第四,**它不碰权限,也不碰整块磁盘的占用定位。**前者是目录那一层的事,后者针对的是"磁盘怎么被占满";本文讨论的是单个文件这一层。
第五,**它不贴任何实际运行输出。**本文所有代码块都是本机未实测的只读或演示动作用例,输出随环境不同,一条都不贴。
配套资料:本文这份自检表,加上第五章那张"不同对象删掉的是什么"的对照表,一并收在资料包里,扫码即可获取:
附表 A:本文引用事实与官方出处对照表
| # | 事实(照口径) | 一手出处 | 核验日期 | 本文位置 |
|---|---|---|---|---|
| 1 | 逐字:NAME: rm - remove files or directories | rm手册页(colophon 标 coreutils-9.11)— https://man7.org/linux/man-pages/man1/rm.1.html | 2026-09-28 | 第 1 章 |
| 2 | 逐字:Remove (unlink) the FILE(s). | 同第 1 行 | 2026-09-28 | 第 1 章 |
| 3 | 逐字:This manual page documents the GNU version of rm. rm removes each specified file. By default, it does not remove directories. | 同第 1 行 | 2026-09-28 | 第 2 章、第 3 章 |
| 4 | 逐字:If you use rm to remove a file, it might be possible to recover some of its contents, given sufficient expertise and/or time. For greater assurance that the contents are unrecoverable, consider using shred(1). | 同第 1 行 | 2026-09-28 | 第 6 章 |
| 5 | 逐字:Any attempt to remove a file whose last file name component is ‘.’ or ‘…’ is rejected with a diagnostic. | 同第 1 行 | 2026-09-28 | 第 2 章 |
| 6 | 逐字(节选):To remove a file whose name starts with a ‘-’, for example ‘-foo’, use one of these commands: | 同第 1 行 | 2026-09-28 | 第 2 章 |
| 7 | 逐字:-i一行说明为 prompt before every removal | 同第 1 行 | 2026-09-28 | 第 3 章 |
| 8 | 逐字:NAME: unlink, unlinkat - delete a name and possibly the file it refers to | unlink(2)手册页(colophon 标 man-pages 6.19)— https://man7.org/linux/man-pages/man2/unlink.2.html | 2026-09-28 | 第 1 章、第 2 章 |
| 9 | 逐字:unlink() deletes a name from the filesystem. If that name was the last link to a file and no processes have the file open, the file is deleted and the space it was using is made available for reuse. | 同第 8 行 | 2026-09-28 | 第 2 章、第 3 章 |
| 10 | 逐字:If the name was the last link to a file but any processes still have the file open, the file will remain in existence until the last file descriptor referring to it is closed. | 同第 8 行 | 2026-09-28 | 第 4 章 |
| 11 | 逐字:If the name referred to a symbolic link, the link is removed. | 同第 8 行 | 2026-09-28 | 第 5 章 |
| 12 | 逐字:If the name referred to a socket, FIFO, or device, the name for it is removed but processes which have the object open may continue to use it. | 同第 8 行 | 2026-09-28 | 第 5 章 |
| 13 | 逐字:NAME: shred - overwrite a file to hide its contents, and optionally delete it | shred手册页(同 coreutils-9.11)— https://man7.org/linux/man-pages/man1/shred.1.html | 2026-09-28 | 第 6 章 |
| 14 | 逐字:Overwrite the specified FILE(s) repeatedly, in order to make it harder for even very expensive hardware probing to recover the data. | 同第 13 行 | 2026-09-28 | 第 6 章 |
| 15 | 逐字:CAUTION: shred assumes the file system and hardware overwrite data in place. Although this is common, many platforms operate otherwise. Also, backups and mirrors may contain unremovable copies that will let a shredded file be recovered later. | 同第 13 行 | 2026-09-28 | 第 6 章 |
| 16 | 被删除的内容在物理介质上以什么形式残留、能留多久 | 待验证:官方只给到"可能恢复部分内容"这一层,未给残留形式与时间口径 | 2026-09-28 | 第 1 章、第 6 章(待验证) |
| 17 | 桌面环境里"回收站"由谁实现、它与rm的差别 | 待验证:本文取用的三份手册页均未涉及回收站 | 2026-09-28 | 第 1 章(待验证) |
| 18 | shred在不同文件系统与不同硬件上的实际效果 | 待验证:官方 CAUTION 已明说它不适用于所有平台,本文不实测 | 2026-09-28 | 第 6 章(待验证) |
附表 B:术语速查表
| 术语 | 一句话解释 |
|---|---|
| 名字(name) | 目录里记录的那串字符;官方在unlink标题里把它与"文件"分开说 |
unlink | 官方给删除这个动作的名字:删掉一个名字,可能连带删掉它指向的文件 |
rm | 你手里用的命令;官方口径是删掉每一个被指定的文件,默认不删目录 |
| 最后一个链接 | 官方判断"文件是否被真正删除"时看的第一个条件 |
| 文件描述符 | 程序打开文件后拿到的凭据,和文件的名字是两回事 |
| 空间可再次使用 | 官方口径里,两个条件都满足才走到这一步 |
| 软链接 | 官方口径:被移走的是链接本身 |
| socket / FIFO / 设备 | 官方口径:名字被删掉,已打开它的进程可能继续使用 |
| 擦除(覆盖) | 反复覆盖内容,目的是让恢复变得更难,不等于"不可能" |
| CAUTION 那句 | 官方给覆盖式删除的前提假设与副本问题留下的警告 |
| 待验证 | 本文中表示"截至 2026-09-28 未取到官方逐字依据"的标记 |
写在最后:这篇用到的资料
写这篇文章时,我把
rm、unlink(2)和官方点名的那份手册页挨着读了一遍。最让我停一下的是unlink(2)标题里那个 possibly——删掉的是名字,文件是不是跟着没,官方用的词是"可能"。顺手也整理了几份配套的东西:
- 删除语义速查卡:名字与内容的两个条件、两种现象、不同对象分别删掉什么
- 靶场环境对照表:DVWA、upload-labs 在 Windows / macOS / Linux 三平台的可行性与推荐路径
- Web 安全学习路线图:从基础打牢到安全管理,四个阶段各学什么
资料是我自己整理的,放在下面这个码上,扫码即可获取:
添加时备注「靶场」,优先通过。
拿到之后建议先看删除语义速查卡那一份,先分清"名字没了"和"内容没了"是两件事,再决定下一步怎么做。