识别未知的文件格式可能会很痛苦。
但是你有一些选择。我将从一个非常明显的开始。
问
向其他人展示该格式可能是找出其名称的最佳方式。
有人可能会认出它。如果没有人这样做,很有可能
您面前有一个专有的文件格式。
如果是您的 yum 存储库文件,我会说它是一个普通的旧 INI 文件。
但让我们对此进行更多研究。
逆向工程
如果没有人认可您的格式,逆向工程可能是您的最佳选择。
获取参考实现并找出他们使用什么来解析格式。
幸运的是,yum 是开源的。所以很容易查到。
让我们看看 yum 作者用什么来解析他们的 repo 文件:
try:
ini = INIConfig(open(repo.repofile))
except:
return None
https://github.com/rpm-software-management/yum/blob/master/yum/config.py#L1304
现在这个函数的导入可以在这里找到:
from iniparse import INIConfig
https://github.com/rpm-software-management/yum/blob/master/yum/config.py#L32
这将我们引向一个名为 iniparse (https://pypi.org/project/iniparse/) 的库。
所以 yum 对其配置文件使用 INI 解析器。
我将向您展示如何快速导航到这些代码段落
因为在一些大型项目中导航可能会令人生畏。
我使用一个名为 ripgrep (https://github.com/BurntSushi/ripgrep) 的工具。
我最初的锚点通常是众所周知的文件路径。如果是 yum,我使用 /etc/yum.repos.d 进行初步搜索:
# assuming you are in the root directory of yum's source code
rg /etc/yum.repos.d yum
yum/config.py
769: reposdir = ListOption(['/etc/yum/repos.d', '/etc/yum.repos.d'])
yum/__init__.py
556: # (typically /etc/yum/repos.d)
这将其缩小到两个文件。如果您继续使用 read 或 parse 等术语,
你会很快找到你想要的结果。
如果没有参考来源怎么办?
嗯,有时,您无法访问参考实现的源代码。例如:参考实现是闭源的。
尝试打破格式。插入一些垃圾,然后观察日志文件。如果你幸运的话,你可能会发现
一条有用的错误消息,可能会为您提供有关格式的提示。
如果你觉得很勇敢,你也可以尝试使用真正的反编译器。这可能是也可能不是非法的,可能是也可能不是浪费时间。
我个人只会将此作为最后的手段。