授权与合规声明
本文全部操作对象均为自建隔离靶场(本机容器或隔离虚拟机),涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款,须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离,不含任何攻击步骤、利用载荷与绕过手法,请勿将文中环境指向任何非自有系统。
一、一个后缀和内容对不上的文件
1.1 三个很常见的场景
场景一:从网上下载的一份文件,后缀看着像某一种,双击却打不开,用编辑器打开是一堆看不出意义的东西。
场景二:某个仓库里躺着一个不带后缀的文件,你甚至不确定它算什么;交给file这个命令,它却能告诉你这是一份脚本。
场景三:有一份文件,肉眼看上去通篇是文字,却被判定为data。
三个场景指向同一件事:**文件类型的判定,看的不是它叫什么名字,而是它装着什么内容。**名字可以随手改掉,里面的东西却不会被顺手改一遍。
还有一种情况:改了后缀之后,某些工具打开它的方式跟没改之前一样。这类现象本文未实测,只做描述,不展开。
这句话不是我的判断。file手册页从 NAME 一行到 DESCRIPTION 一段,写的都是"怎么从内容判定类型"这件事。本文把这套判定拆成几层:分几步走、每步在看什么、输出用哪些词、认不出来时怎么办,以及"后缀"站在什么位置。
1.2 先把"名字"和"内容"分开
初学者最容易把三样东西当成一样:文件叫什么名字、文件里装着什么、系统为它记着什么属性。它们是来源不同的三份信息,判定类型时各有分量。本文只关心一件事:判断"这是什么文件"时,该依据哪一份。
| 你手上能拿到的东西 | 它从哪里来 | 在这个判定过程里用不用得上 |
|---|---|---|
| 文件名的后缀 | 文件名字符串的一部分 | 手册页列出的三组测试里没有它(第六章展开) |
| 文件开头那一段字节 | 文件内容自己 | 用得上,对应 magic 测试 |
| stat 带回来的元信息 | 文件系统为这个文件记的属性 | 用得上,对应文件系统测试 |
| 文本自身的语言特征 | 文件内容自己 | 用得上,对应语言测试(放在最后一步) |
⚠️代码待验证
【两份信息的来源不一样】 文件的名字 -> 只是"你给它取的称呼",改名字改掉的只是称呼 文件的内容 -> 是"它自己带的东西",改名不会顺手把它改掉 所以:按名字判类型,等于按称呼判人; 按内容判类型,才是去看它身上带着什么。表里两条格外值得记住:后缀不在官方列出的判定依据里;真正被用来判定的东西,一部分来自文件内容本身,一部分来自文件系统的记录——两者到手的方式完全不同,第三章分开讲。
1.3 本文的范围划在哪
这篇只讲"类型由谁定"这一层,也就是file手册页描述的那套判定。范围之外一概不碰,先把边界说清楚:
- 行尾与编码怎么识别,属另一层,本文不展开;
- Web 服务器拿到文件之后怎么处理它,也属另一层,本文不碰;
- 怎么把文件弄成"看起来像另一种类型",属于不写的方向,一个字都不给。
范围收窄之后只剩一个问题:一个文件被判成什么类型,这个结论是怎么得出来的。
二、判定发生在三组测试里,而且有顺序
2.1 手册页那句最硬的话
file手册页的 NAME 一行只有一句(逐字引文见附表 A 第 1 行):
file — determine file type
逐字读:file这个命令的用途就是"判定文件类型"。它没说"根据后缀推断",也没说"读某个表",只说"判定";怎么判定的答案在 DESCRIPTION 一节,第一段就把流程交代完了(逐字引文见附表 A 第 2 行):
file tests each argument in an attempt to classify it. There are three sets of tests, performed in this order: filesystem tests, magic tests, and language tests. The first test that succeeds causes the file type to be printed.
三层意思:第一,判定是靠"测试"做的——file不是在查"后缀对类型"的对照表,而是在文件身上主动试各种判据;第二,三组测试有固定顺序——文件系统测试(filesystem tests)、magic 测试(magic tests)、语言测试(language tests),不能颠倒;第三,第一个成功的测试就定案——哪一组先得出结果,类型就定了,后面的测试不再影响结论。
"顺序"和"第一次成功就停"含的信息量比表面上大,下一节说清为什么。
2.2 顺序这两个字不是摆设
很多人看到"三组测试",会顺口理解成三组结果凑在一起综合出结论。这套流程不是这么运作的。
performed in this order加上The first test that succeeds,把一个判定的形态说得很清楚:它是一问一问往下问,问到第一句"是"就停下来,不是把所有答案汇总打分。就像找东西:先摸口袋,口袋里有就结束了,不会把抽屉和箱子全翻一遍再取交集。
| 次序 | 官方英文名 | 中文说法 | 它在看什么(第三章展开) |
|---|---|---|---|
| 第一组 | filesystem tests | 文件系统测试 | 系统为这个文件记下的那些属性 |
| 第二组 | magic tests | magic 测试 | 文件开头某个固定位置上的标识 |
| 第三组 | language tests | 语言测试 | 文本自己的语言特征 |
这张表顺带解释了一件事:为什么"看起来是文本"的文件有时会被判成data。如果第一组或第二组测试先成功了,判定在那一刻就结束,文本这一层根本没机会被看。顺序本身就是结论的一部分。
⚠️代码待验证
【判定的形态:一问一问往下问】 拿到一个文件 ├─ 第一组:文件系统测试 ── 成功 -> 定案,停 ├─ 第二组:magic 测试 ── 成功 -> 定案,停 └─ 第三组:语言测试 ── 成功 -> 定案,停 └─ 三组都没成功 -> 走兜底(第五章) 关键不在"有哪些测试",而在"第一个成功的就定案"。2.3 一个会改变"停不停"的开关
默认是"第一个成功的测试就定案"。官方另给了一个选项专门改它(逐字引文见附表 A 第 10 行):
Don’t stop at the first match, keep going.
逐字读:不要在第一个匹配上停下来,继续往下走。这个选项就是-k,长写法是--keep-going。它对应的场景很具体:你想看到"如果不止看一步,后面还会怎么说",而不是只要一个能用的结论。
需要留意的是,它只改变"停不停",并没有改变"第一个成功的测试原本会定出什么案"。
| 你想要的 | 用不用-k | 结论由谁给出 |
|---|---|---|
| 一个能用的类型结论 | 不用(默认) | 第一个成功的测试 |
| 想知道后面测试还会怎么说 | 用-k | 不再停在第一个匹配上 |
本章可以带走的一句:类型不是"综合"出来的,是"第一个成功的测试"给出的;顺序由官方定死,不随机。
三、三组测试分别在看什么
第二章说了有三组测试、有顺序,这一章讲清三组各自"在看什么"——以后看到一个判定结果,你能大致知道它从哪一路来。
3.1 第一组:文件系统测试,看的是 stat 带回来的东西
官方对这一组的说明是(逐字引文见附表 A 第 3 行):
The filesystem tests are based on examining the return from a stat(2) system call. The program checks to see if the file is empty, or if it’s some sort of special file.
逐字读:文件系统测试建立在检查stat(2)这个系统调用的返回值之上;程序在这组测试里看的是——这个文件是不是空的,或者它是不是某种特殊文件。
这一组和前两组有一个根本区别:它看的东西不来自文件内容。stat取回的是文件系统为这个文件记着的那份属性,也就是 1.2 节表格里的第三行。文件是不是空的、是不是特殊文件,这类信息属性里就有,不需要读内容。
这解释了一个常被问到的现象:一个完全无内容的文件被判成某种类型,并不是它里面"藏着"什么,而是第一组测试在属性上就先成功了。
⚠️代码待验证
# 只写在 /tmp 下面的临时演示文件mkdir-p/tmp/type-demoprintf'demo content for type check\n'>/tmp/type-demo/demo.txt# 只读动作一:看它被判成什么类型file/tmp/type-demo/demo.txt# 只读动作二:看 stat 带回来的属性,对照第一组在看什么stat/tmp/type-demo/demo.txt# 只读动作三:连名字一起看,判定依据并不在这串名字里ls-l/tmp/type-demo/demo.txt这三条都是只看不改。本文不贴运行输出——它随环境变化,现象与语义用文字说清就够。
3.2 第二组:magic 测试,看的是文件开头某个固定位置上的标识
官方对这一组的说明分在几句话里,先给定义(逐字引文见附表 A 第 4 行):
The magic tests are used to check for files with data in particular fixed formats.
逐字读:magic 测试用来检查那些采用某种固定格式存放数据的文件。接着官方交代了"固定格式"的标志放在哪:
These files have a “magic number” stored in a particular place near the beginning of the file
逐字读:这类文件在靠近文件开头的一个特定位置存着一个"magic number"。最后一句把适用范围点得更宽:
The concept of a “magic number” has been applied by extension to data files. Any file with some invariant identifier at a small fixed offset into the file can usually be described in this way.
逐字读:只要一个文件在开头附近某个小的固定偏移处放着一个不变的标识,往往就能靠这个方式把它描述出来。
把三句合起来,判据是两个词:固定位置 + 不变的标识。判定不必读完整份文件,只要在开头附近取一小段跟已知标识对上,结论就出来了。这也是"改了名字带不走"最直观的证明:magic number 待在内容里,你把文件改成什么名字,它都还在那儿。
3.3 第三组:语言测试,看的是文本自己的特征
第三组的官方说明是(逐字引文见附表 A 第 5 行):
Once file has determined the character set used in a text-type file, it will attempt to determine in what language the file is written.
逐字读:一旦file判定出这个文本类文件使用的是哪种字符集,它就会进一步尝试判断这个文件是用哪种语言写的。这里要留意顺序:得先确认这是一份文本、并认出它用的字符集,语言测试才有落脚点。
而官方紧接着自己就给这一组打了折(逐字引文同附表 A 第 5 行):
These tests are less reliable than the previous two groups, so they are performed last.
逐字读:这组测试不如前两组可靠,所以被放在最后执行。
官方把"不如前两组可靠"和"放在最后"直接写在同一句里,因果交代得非常清楚:正因为可靠性低,才排到最后;也只有前两组都没能定案的时候,才轮到它上场。这一句是第三章最该记住的话——它解释了为什么三组测试的顺序不能随便换。
本章可以带走的一句:三组测试分别在三个地方找线索——属性里、文件开头某个固定位置、文本自身的特征;官方自己承认第三组可靠性最低。
四、判定结果会用哪三类词写出来
判定过程讲完了,这一章讲它交回来的结论长什么样。
4.1 输出里会出现三类词
官方对输出的说明是(逐字引文见附表 A 第 6 行):
The type printed will usually contain one of the words text (the file contains only printing characters and a few common control characters and is probably safe to read on an ASCII terminal), executable (the file contains the result of compiling a program in a form understandable to some UNIX kernel or another), or data meaning anything else (data is usually “binary” or non-printable).
这段话括号里给每个词都配了定义,逐条拆开:
text:文件里只包含可打印字符和少量常见控制字符,大概可以放心在一个 ASCII 终端上读它。留意官方用的是"probably safe",是一个带保留的说法,不是保证。executable:文件里装着某个程序被编译之后的结果,形态是某个 UNIX 内核(或其他内核)能读懂的。data:意思是"其它情况",官方补了一句——data一般是"二进制"或不可打印的。
⚠️代码待验证
【三类词各自的口径(照官方原句)】 text -> 只含可打印字符和少量常见控制字符,大概能安全地在 ASCII 终端上读 executable -> 装着编译之后的程序结果,形态是某个内核能读懂的 data -> 其它情况,一般是二进制或不可打印的 两处分寸:text 那句官方用 "probably safe"(带保留); data 这类的定义本身就是 "anything else"(兜底)。4.2 data 是"剩下的一类"
三类词里,text和executable都是"说明了是什么",只有data是"没说明是什么"——它的定义字面上就是anything else(其它情况)。
这一点值得单独强调,因为它正好回答 1.1 节的第三个场景:一份看上去通篇是文字的文件被判成data,并不等于"这个文件很神秘"。结合第二章的顺序机制,更常见的解释是——前面某组测试先成功了,或语言那一层没能把它认成文本,落到最后就归进了"剩下的那一类"。data不是一种"更严重"的类型,它就是这一层判定的默认归宿。
另外,官方在这段里用的是usually(通常)——输出里还会带上类型的具体描述,这三个词只是其中最常出现的。
4.3 落到你身上的一步
看到一份文件的类型结论,可以按这个次序去读:
| 你看到结论里带的是 | 大致说明什么 | 你接下来该去看 |
|---|---|---|
text | 内容是文本,大概能安全地读 | 内容本身(具体属另一层) |
executable | 内容是编译之后的程序结果 | 它是不是你要执行的那个东西 |
data | 上面两类之外的其它情况 | 回到第二、三章,看是哪一组测试先定了案 |
本章可以带走的一句:三类词里,text和executable说的是"是什么",data说的是"不是上面两类";把data当成一种结论去进一步推断,容易走偏。
五、都匹配不上时它怎么办
5.1 兜底那一步:看它像不像文本
如果第二组的 magic 测试没有命中任何一条,官方还有一步(逐字引文见附表 A 第 8 行):
If a file does not match any of the entries in the magic file, it is examined to see if it seems to be a text file.
逐字读:如果一个文件跟 magic 文件里的任何一条记录都对不上,它会被检查一下,看看它是不是像一份文本文件。
这句话把整体形状说清楚了:**不是"匹配不上就放弃",而是再往下试一步。**判据从"某个固定位置的标识"换成"整体看起来像不像文本",也就是从第二组落到第三组的门口。
这里出现一个新词——magic 文件,是第二组测试用来比对的那些记录存放的地方。如实交代:不同系统上它放在哪里、收录哪些记录,本文未实测,也不凭印象给路径,附表 A 里标了本文未实测。
5.2 连兜底也认不出,结果就是 data
兜底那一步也有边界。官方另有一句把最后的归宿写死了(逐字引文见附表 A 第 7 行):
Any file that cannot be identified as having been written in any of the character sets listed above is simply said to be “data”.
逐字读:任何无法被认定为用上述任何字符集写成的文件,就直接被说成是data。
两句合起来,兜底逻辑就完整了:magic 匹配不上,就看它像不像文本;连文本都不像,结果就是data。data是这套流程走到底后剩下的那一类。
⚠️代码待验证
【走到最后一步的完整路径(只看,不改)】 第二组 magic 测试没命中 │ ├─ 兜底:看它像不像一份文本文件? │ ├─ 像 ──> 进入文本判定这一路 │ └─ 不像 ──> 结果就是 data │ └─ 兜底具体比对哪些字符集,属字符集与编码那层,本文不展开。5.3 从现象倒推该看哪一组
把前面几章压成一张表,遇到具体现象可直接对照:
| 你遇到的现象 | 最可能要回到哪一组 | 为什么 |
|---|---|---|
| 空文件也被判出了类型 | 第一组,文件系统测试 | 它看的是 stat 带回来的属性,不读内容 |
| 改了名字,结论还是老样子 | 第二组,magic 测试 | 判据在文件开头某个固定位置,不在名字里 |
通篇是文字却被判成data | 第二、三组的交界处 | 前面的测试已定案,或语言那一层没认成文本 |
| 结论明显不合理 | 先确认被判定的是哪一份文件 | 判定对象错了,后面对照哪一组都没意义 |
这张表最后一行是最实际的一条提醒:先确认"被判定的到底是哪个文件",再讨论判定过程,否则容易在正确的原理上得出错误的结论。
配套资料:把这一章那张"从现象倒推该看哪一组"的对照表整理成了一份速查卡,和类型判定的三组测试放在一起,放在资料包里,扫码即可获取:
六、扩展名在这套判定里的位置
这一章要讲的是一个很容易被说过头的问题:扩展名到底和文件类型是什么关系。口径必须拿准,说少了不解决问题,说多了就是替官方立规矩。
6.1 手册页列出的判定依据里,有哪三组
回到第二章那句最硬的话(逐字引文见附表 A 第 2 行)。它在 DESCRIPTION 里把判定依据列成三组:文件系统测试、magic 测试、语言测试。
**这份清单里没有扩展名。**手册页讲"怎么判定类型"的那一段,只列了这三组,没有把后缀列为判定手段之一。
这就回答了 1.1 节的场景:没有后缀的文件能被判出类型,因为判定本来不依赖后缀;后缀被改过的文件仍判成原类型,因为判据待在内容里,改名动不到它。
6.2 扩展名出现在哪里:一个选项的输出
既然扩展名不在判定依据里,它在手册页里出现在哪?答案是:出现在选项里,作为输出的一部分。
file有一个选项叫--extension,官方的说明是(逐字引文见附表 A 第 9 行):
Print a slash-separated list of valid extensions for the file type found.
逐字读:打印出一串用斜杠分隔的、适用于"已经判定出的那个文件类型"的合法扩展名。
留意for the file type found这个说法:是先判定了类型,再列这个类型常见的扩展名。也就是说,扩展名在这套流程里是输出的一部分,不是输入依据;方向是"类型 → 扩展名",不是"扩展名 → 类型"。
| 位置 | 扩展名在这里扮演什么 | 官方依据 |
|---|---|---|
| DESCRIPTION 里讲判定依据的三组测试 | 没有被列为判定手段 | 三组测试清单里没有它 |
--extension这个选项 | 判定之后,输出该类型对应的扩展名 | Print a slash-separated list of valid extensions for the file type found. |
⚠️代码待验证
# 只读动作一:让 file 在判定之后,把该类型对应的扩展名候选列出来file--extension/tmp/type-demo/demo.txt# 只读动作二:对照——不带这个选项时,交回来的只有类型本身file/tmp/type-demo/demo.txt两条动作的差别,就是"输出里多一列"和"输出里少一列"的差别:判定那一步并没有因为加了选项而改变依据。
6.3 这句话能说到哪一步
到这里要停一下,把分寸划清,因为这一步最容易说岔。
能说的:手册页列出的三组判定测试里没有扩展名;扩展名是--extension的输出之一,出现在类型判定之后。
不能说的:不能把它推成"扩展名和文件类型完全没有关系"。手册页没有下过这样的结论,我也不会替它下。扩展名在实际使用里仍承载不少约定——有些工具按后缀决定用什么方式打开,有些流程按后缀做筛选——但那些是"使用上的约定",和"判定类型的依据"是两回事,本文不展开。
两种说法的差别压成一行:**本文说的是"手册页列出的判定依据里没有它",不是"它在任何意义上都不代表类型"。**前者是手册页写着的,后者是替官方越界。
本章可以带走的一句:方向是"类型 → 扩展名",不是"扩展名 → 类型";把扩展名当判定依据,等于把输出当输入用。
七、把这一层收成一份可以对着用的清单
前面六章讲过程,这一章压成可以直接对着看的东西。
7.1 一份只看不改的自检清单
⚠️代码待验证
【文件类型判定自检清单 · 只看不改】 1. 我要判定的,是哪个文件? -> 先把判定对象确认清楚,再谈结论 2. 我的结论是从名字来的,还是从内容来的? -> 名字(后缀)不在手册页列出的三组判定依据里 3. 手册页列出的判定依据是哪三组? -> 文件系统测试 / magic 测试 / 语言测试,且顺序固定 4. 为什么只给了一个结论? -> "第一个成功的测试就定案",后面的不再参与 5. 结论里带的是 text / executable / data 哪一个? -> data 的定义就是"其余情况",它不代表更严重 6. magic 没命中时会怎样? -> 还有一步兜底:看它像不像文本;连文本都不像,就是 data 7. 我看到的扩展名是从哪来的? -> 是 --extension 的输出,在类型判定之后,不是判定依据 8. 我有哪一条没核到官方口径? -> 标"本文未实测",不凭印象填空7.2 三条可以带走的动作
第一条,判类型先问来源。结论是从文件名来的,还是从内容来的?只要是从后缀来的,它就不是本文讲的那套判定。
第二条,记住"第一个成功的就定案"。看到意料之外的结论时,别急着怀疑内容,先想是哪一组测试先成功了。
第三条,扩展名往回用,不要往前推。先判类型再列扩展名,是官方给的方向;拿后缀反推类型,方向是反的。
7.3 这份清单不覆盖什么
第一,**它不解释行尾与编码的识别。**那属于另一层的讨论,本文只在官方原句里顺带碰到过一次字符集的说法,不展开。
第二,**它不解释 Web 服务器拿到文件之后怎么处理它。**那属于另一层,本文不碰。
第三,**它不给任何"把文件弄成另一个类型看上去的样子"的做法。**这类内容不在本文方向上,一个字都不写。
第四,**它不贴任何运行输出。**代码块都是本机未实测的只读动作,输出随环境变化,一条都不贴。
第五,**它不给清单里没有的映射。**官方口径全部收在附表 A 里,逐条标了出处与核验日期。
配套资料:这一章这份自检清单,和第五章那张"从现象倒推该看哪一组"的对照表,是可以对着用的两页,放在资料包里,扫码即可获取:
附表 A:本文引用事实与官方出处对照表
| # | 事实(照口径) | 一手出处 | 核验日期 | 本文位置 |
|---|---|---|---|---|
| 1 | 逐字:file — determine file type | file 手册页(页面标注 version 5.46,页脚 FILE(1) GNU June 17, 2025)— https://man7.org/linux/man-pages/man1/file.1.html | 2026-09-28 | 第 2 章 |
| 2 | 逐字:file tests each argument in an attempt to classify it. There are three sets of tests, performed in this order: filesystem tests, magic tests, and language tests. The first test that succeeds causes the file type to be printed. | 同第 1 行 | 2026-09-28 | 第 2 章、第 6 章 |
| 3 | 逐字:The filesystem tests are based on examining the return from a stat(2) system call. The program checks to see if the file is empty, or if it’s some sort of special file. | 同第 1 行 | 2026-09-28 | 第 3 章 |
| 4 | 逐字:The magic tests are used to check for files with data in particular fixed formats. / These files have a “magic number” stored in a particular place near the beginning of the file / The concept of a “magic number” has been applied by extension to data files. Any file with some invariant identifier at a small fixed offset into the file can usually be described in this way. | 同第 1 行 | 2026-09-28 | 第 3 章 |
| 5 | 逐字:Once file has determined the character set used in a text-type file, it will attempt to determine in what language the file is written. / These tests are less reliable than the previous two groups, so they are performed last. | 同第 1 行 | 2026-09-28 | 第 3 章 |
| 6 | 逐字:The type printed will usually contain one of the words text (the file contains only printing characters and a few common control characters and is probably safe to read on an ASCII terminal), executable (the file contains the result of compiling a program in a form understandable to some UNIX kernel or another), or data meaning anything else (data is usually “binary” or non-printable). | 同第 1 行 | 2026-09-28 | 第 4 章 |
| 7 | 逐字:Any file that cannot be identified as having been written in any of the character sets listed above is simply said to be “data”. | 同第 1 行 | 2026-09-28 | 第 5 章 |
| 8 | 逐字:If a file does not match any of the entries in the magic file, it is examined to see if it seems to be a text file. | 同第 1 行 | 2026-09-28 | 第 5 章 |
| 9 | 逐字:Print a slash-separated list of valid extensions for the file type found.(--extension选项说明) | 同第 1 行 | 2026-09-28 | 第 6 章 |
| 10 | 逐字:Don’t stop at the first match, keep going.(-k/--keep-going选项说明) | 同第 1 行 | 2026-09-28 | 第 2 章 |
| 11 | magic 文件在不同系统上的存放位置与收录内容差异 | 本文未实测:手册页只提到有这份 magic 文件,未给跨系统差异口径,正文不给路径与结论 | 2026-09-28 | 第 5 章(本文未实测) |
| 12 | 后缀被改过之后,其它工具是否仍按原来的内容处理该文件 | 本文未实测:清单里没有对应的官方口径,正文只做现象描述并标注 | 2026-09-28 | 第 1 章(本文未实测) |
| 13 | 兜底那一步列举的具体字符集名单 | 待验证:官方原句只说明"无法认定为上述任一字符集就是 data",名单本身属字符集与编码那一层,本文不展开 | 2026-09-28 | 第 5 章(待验证) |
附表 B:术语速查表
| 术语 | 一句话解释 |
|---|---|
| 文件类型判定 | 判断"这是什么文件"的过程;本文讲file手册页描述的那一套 |
file | 官方 NAME 一行给出的用途是"determine file type",即判定文件类型 |
| 三组测试 | 文件系统测试 / magic 测试 / 语言测试,官方规定按此顺序执行 |
| 第一个成功的测试就定案 | 哪一组测试先得出结果,类型就定了,后面的测试不再参与 |
| 文件系统测试 | 第一组,依据stat(2)的返回值,看文件是否为空或是否为特殊文件 |
| magic 测试 | 第二组,看文件开头某个固定位置上是否有不变的标识(magic number) |
| magic number | 存在文件开头附近某个特定位置的固定标识,用来描述该文件的格式 |
| magic 文件 | magic 测试用来比对的那些记录所在的地方;跨系统差异本文未实测 |
| 语言测试 | 第三组,在认出文本与字符集之后判断用哪种语言写的;官方自陈不如前两组可靠 |
text | 只含可打印字符和少量常见控制字符,官方口径是"大概能安全地读" |
executable | 装着编译之后的程序结果,形态是某个内核能读懂的 |
data | 官方定义为"其余情况",一般是二进制或不可打印的;是兜底后剩下的那一类 |
-k/--keep-going | 不停在第一个匹配上,继续往下走 |
--extension | 在类型判定之后,输出该类型对应的扩展名;属输出,不是判定依据 |
| 只读动作 | 本文允许的动作范围:只看不改,不含写入、删除与安装类操作 |
| 本文未实测 | 本文中表示"该项未在本机核过"的标记 |
| 待验证 | 本文中表示"未取到官方逐字依据"的标记 |
写在最后:这篇用到的资料
写这篇文章时,我把
file手册页从 NAME 到 DESCRIPTION 挨着读了一遍。读到"三组测试、第一个成功的就定案"那句才发现,判据在文件自己身上,不在名字上。顺手也整理了几份配套的东西:
- 文件类型判定速查卡:三组测试各自在看什么、三类输出词的官方口径与出处
- 靶场环境对照表:DVWA、upload-labs 在 Windows / macOS / Linux 三平台的可行性与推荐路径
- Web 安全学习路线图:从基础打牢到安全管理,四个阶段各学什么
- 常用靶场清单:每个靶场练什么、适合哪个阶段
资料是我自己整理的,放在下面这个码上,扫码即可获取:
添加时备注「靶场」,优先通过。
拿到之后建议先看文件类型判定速查卡那一份,先分清"后缀"和"内容"是两回事。