如何为文件 -i 添加新的 mime 类型?

Bad*_*ake 5 command-line rhel mime-types

在我们的服务器上,我们遇到一些 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
Run Code Online (Sandbox Code Playgroud)

我已将其放入/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
Run Code Online (Sandbox Code Playgroud)

那些不起作用。我已经坐在十六进制编辑器和手册页上好几个小时了,我找不到错误。我尝试过十六进制,我尝试过字符串等。

Geo*_*xon 3

简短回答:

\n\n
curl -Ls https://git.io/fj9xx > ole2compounddocs\nfile -m ole2compounddocs -e cdf -b --mime-type file.pub\n\napplication/vnd.ms-publisher\n
Run Code Online (Sandbox Code Playgroud)\n\n

长答案:

\n\n

首先(为了后代,一些背景):

\n\n

file实用程序(即当今大多数系统使用的实现)是 Ian Darwin 的“Fine Free File Command”(在某些包管理器中,这称为file;在其他情况下,称为 )libmagic。该file命令是一个 CLI 实用程序包装libmagic. 基本上,它们是同一件事。

\n\n

libmagic本身通常依赖于“魔法”文件的“数据库”(一个压缩的串联列表,通常称为“magic.mgc”,根据操作系统安装在各个位置),其中包含正则表达式和库可以使用的其他模式的指纹来自原始二进制样本的未知文件(或数据流)的“类型”。

\n\n

文件的文件类型是通过基于内部规则的各种标准列表、文件名/扩展名(如果有)、“主”压缩魔术文件以及使用标志添加到命令行上的任何魔术文件来确定的-m

\n\n

该工具必须在文件的“类型”和其中包含的信息之间取得平衡。在许多情况下,文件扩展名没有什么价值,但有一些价值;以 .zip 文件和 .jar 文件的经典情况为例。两者都是“zip文件”,即,它们是用Info-Zip规范压缩的文件。在这种情况下,文件扩展名应该足以让它知道这是一个 Java 可执行文件,而不仅仅是一个 zip 存档。然而,对于 Microsoft Publisher 的“.pub”扩展名来说,这几乎没有什么价值,因为 *nix 平台上“.pub”最常见的用途是用于 SSH 公钥。

\n\n

使问题更加复杂的事实是,微软在其“复合文档文件”档案中使用了多个不同版本的“对象链接和嵌入(OLE)”格式,用于无数不同的应用程序。这些文件本身通常是压缩的 XML 文件。所有这些都增加了一些相当困难(且计算成本昂贵)的逻辑,以深入研究多种二进制/压缩格式,以便能够区分“Publisher”文档和 Microsoft Outlook 数据库等。

\n\n

最后,值得注意的是,MIME 类型(从技术上讲,IANA 媒体类型)是众所周知的不可靠的“内容处置”标记,正是由于上述原因,并且因为许多开发人员懒得注册他们的“供应商”( vdn.xxxxxxx) 类型:尽管 Microsoft 已注册多种媒体类型application/vnd.ms-office(用于fileCDF/CDF2 文件),但未注册,就像application/ms-publisher. 事实上,mime.typeslibmagic 从未检查过该文件,并且它的存在在大多数平台上根本不是标准的。相反,MIME 类型简单地硬编码在“神奇”文件中,并且application/vnd.ms-publisher最近才被添加。

\n\n

同样重要的是要注意,该-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 类型的计算成本明显更高 \xe2\x80\x94 的结果需要application/vnd.ms-office六个神奇的测试操作,而application/vnd.ms-publisher需要数百或数千(您可以使用-d旗帜)。最好避免的另一个原因是-i:在大多数较新版本中file,该标志返回 MIME 编码以及 MIME 类型,因此--mime-type如果您不希望结果是这样,最好使用application/vnd.ms-publisher; charset=binary.

\n\n

总之,为了获得您想要的结果,我的建议是:

\n\n
    \n
  1. file从前沿源重新编译新版本,并且
  2. \n
  3. 使用标志:file -b -e cdf --mime-type而不是file -bi
  4. \n
\n