把文件删了内容就没了么:删除这一层做了什么 授权与合规声明本文全部操作对象均为自建隔离靶场本机容器或隔离虚拟机涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离不含任何攻击步骤、利用载荷与绕过手法请勿将文中环境指向任何非自有系统。一、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 版本的rmrm会删掉每一个被指定的文件默认情况下它不删目录。这句话里有一件实用的事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-demoprintfdemo 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-demoprintfdemo 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 官方点名的那一个以及它自己的 CAUTIONrm手册页提到的是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 fileoverwrite … 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 directoriesrm手册页colophon 标 coreutils-9.11— https://man7.org/linux/man-pages/man1/rm.1.html2026-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 tounlink(2)手册页colophon 标 man-pages 6.19— https://man7.org/linux/man-pages/man2/unlink.2.html2026-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 itshred手册页同 coreutils-9.11— https://man7.org/linux/man-pages/man1/shred.1.html2026-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 章待验证18shred在不同文件系统与不同硬件上的实际效果待验证官方 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 安全学习路线图从基础打牢到安全管理四个阶段各学什么资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「靶场」优先通过。拿到之后建议先看删除语义速查卡那一份先分清名字没了和内容没了是两件事再决定下一步怎么做。