在我们的服务器上,我们遇到一些 MIME 类型问题。我需要为 Microsoft Publisher 文件添加 mime 类型,以便file -b -i theFile.pub
打印application/x-mspublisher
到命令行。我尝试将其添加到 中/etc/mimes.etc
,但这不起作用。它继续说道application/x-msword
。
我也尝试过通过添加xml xgd-mime
,但这也没有帮助。
我已经通过 hexedit 提取了文件开头的魔术字节,但是,我不确定如何将其添加到file
.有人可以帮忙吗?
再次强调,这只是关于命令行,而不是关于图标。
编辑以详细说明:
# Adobe ESP Script
#-------------------------------------------------------------------------
0 string %\!PS-Adobe-3.1\ EPSF-3.0 Adobe EPS file
32 string %\!PS-Adobe-3.1\ EPSF-3.0 Adobe EPS file
!:strength +50
!:mime application/postscript
我已将其放入/etc/magic
并运行,file -C
并且这个有效。读取文件开头或 32 字节后的字符串。
# Mirosoft Powerpoint
#------------------------------------------------------------------------
1152 string/b x50/x00/x6F/X00/x77&x00/x65/x00 Power
!:mime application/vnd.ms-powerpoint
# Microsoft Publisher
#--------------------------------------------------------------------------
0 quad 0xd0cf11e0a1b11ae1 Publisher Magic Number
4512 string Microsoft\ Publisher\ 3.0 Microsoft Publisher
!:strength +50
!:mime application/vnd.ms-publisher
那些不起作用。我已经坐在十六进制编辑器和手册页上好几个小时了,我找不到错误。我尝试过十六进制,我尝试过字符串等。
答案1
简短回答:
curl -Ls https://git.io/fj9xx > ole2compounddocs
file -m ole2compounddocs -e cdf -b --mime-type file.pub
application/vnd.ms-publisher
长答案:
首先(为了后代,一些背景):
该file
实用程序(即当今大多数系统使用的实现)是 Ian Darwin 的“Fine Free File Command”(在某些包管理器中,这被称为file
;在其他情况下,它被称为libmagic
。该file
命令是一个 CLI 实用程序包装libmagic
。基本上,它们是同一件事。
库libmagic
本身通常依赖于“魔法”文件的“数据库”(一个压缩的串联列表,通常称为“magic.mgc”,根据操作系统安装在各个位置),其中包含正则表达式和库可以使用的其他模式的指纹来自原始二进制样本的未知文件(或数据流)的“类型”。
文件的文件类型是通过基于内部规则的各种标准列表、文件名/扩展名(如果有)、“主”压缩魔术文件以及使用标志添加到命令行上的任何魔术文件来确定的-m
。
该工具必须在文件的“类型”和其中包含的信息之间取得平衡。在许多情况下,文件扩展名没有什么价值,但有一些价值;以 .zip 文件和 .jar 文件的经典情况为例。两者都是“zip文件”,即,它们是用Info-Zip规范压缩的文件。在这种情况下,文件扩展名应该足以让它知道这是一个 Java 可执行文件,而不仅仅是一个 zip 存档。然而,对于 Microsoft Publisher 的“.pub”扩展名来说,这没有什么价值,因为“.pub”在 *nix 平台上最常见的用途是用于 SSH 公钥。
使事情变得更加复杂的是,微软使用了其多个不同版本的产品。“对象链接和嵌入(OLE)”其“复合文档文件”档案中的格式适用于无数不同的应用程序。这些文件本身通常是压缩的 XML 文件。所有这些都增加了一些相当困难(且计算成本昂贵)的逻辑,以深入研究多种二进制/压缩格式,以便能够区分“Publisher”文档和 Microsoft Outlook 数据库等。
最后,值得注意的是 MIME 类型(从技术上讲,IANA 媒体类型)是众所周知的不可靠的“内容处置”标记,正是由于上述原因,并且因为许多开发人员懒得注册他们的“供应商”(vdn.xxxxxxx
)类型:尽管 Microsoft 已经注册了多种媒体类型application/vnd.ms-office
(这就是file
用于CDF/CDF2 文件)未注册,就像application/ms-publisher
.事实上,mime.types
libmagic 从未检查过该文件,并且它的存在在大多数平台上根本不是标准的。相反,MIME 类型简单地硬编码在“神奇”文件中,并且application/vnd.ms-publisher
最近才被添加。
同样重要的是要注意,该-i
标志的功能通常与预期的有很大不同,并且它在 的各个版本中的操作方式不同file
,或者可能根本不存在。然而,一般来说,它的目的是机器可读性,并且(重要的是)在某些版本中,它改变了启发法有利于更多与机器相关的结果。因此,在某些版本file
及其数据库中,您将得到的结果file -bi
很简单:(application/octet-stream; charset=binary
这是有效的非供应商 MIME 类型)而不是application/vnd.ms-office
.如果确实返回 application/vnd.ms-office
(CDF),则需要标志-e cdf
来有效地“传递”该结果,因为(假设)与可以读取 CDF 文件的另一个程序/算法更相关,而不是它是 Publisher 文件这一事实。忽略 CDF 结果来继续搜索并获取任何 ODF2 标识符及其 MIME 类型的计算成本明显更高 - 的结果application/vnd.ms-office
需要六个魔术测试操作,而application/vnd.ms-publisher
需要数百或数千(您可以通过标志看到这一点-d
)。最好避免的另一个原因是-i
:在大多数较新版本中file
,该标志返回 MIME 编码以及 MIME 类型,因此--mime-type
如果您不希望结果是这样,最好使用application/vnd.ms-publisher; charset=binary
.
总之,为了获得您想要的结果,我的建议是:
file
从前沿源重新编译新版本,并且- 使用标志:
file -b -e cdf --mime-type
而不是file -bi
。
答案2
为了让文件了解它,您需要在 /etc/magic.conf 中记录文件开头存储的幻数。这“文件”的手册页描述该文件的工作方式,以及“magic”的手册页描述魔术文件中使用的语法。