我正在尝试确定Centos服务器上已安装的软件,直到现在我“了解”以下两个基本解决方案
解析文件系统中的可执行文件和库
运行类似rpm -qa
第一个很费时,第二个不适用于我的所有情况。例如,即使服务器未运行,我也想“搜索”软件包,并且我只能以远程卷,快照或映像的身份访问其文件系统。
我在想什么是尝试解析rpm -qa
从中读取数据的相同数据库/文件。
运行strace -o /tmp/rpm-strace.out rpm -qa
后,我发现(不确定)/var/lib/rpm/Packages
和/var/lib/rpm/Names
是该“数据库”的某些可能位置,但是我无法解析这两个文件中的任何一个。
有谁知道如何解析这些文件?有什么选择可以实现我想要的吗?
注意:整个想法在this 'Unix & Linux'问题描述的Ubuntu下是可行的。
免责声明:此问题可能更适合于serverfault站点。
最佳答案
您确实需要使用rpm
来解析rpm数据库。如果您有权访问文件系统,则可以使用chroot
在相应的根上下文中运行rpm
:
chroot /my/server/filesystem rpm -qa
这些文件是各种BerkeleyDB数据库文件。假设您的运行时环境具有与BerkeleyDB相同的版本,则可以使用Python的
bsddb
模块读取它们:>>> import bsddb
>>> name = bsddb.btopen('/var/lib/rpm/Name')
>>> for pkg in name.keys():
... print pkg
...
GConf2
GeoIP
GeoIP-GeoLite-data
GeoIP-GeoLite-data-extra
GitPython
GraphicsMagick
[...]
但这是一个可怕的想法,您不应该这样做,因为谁知道
Name
数据库是否完全符合您的需求?也许它包含已删除的软件包,这些软件包以某种方式标记为“已删除”,因此rpm -qa
会忽略它们。您可能需要查看rpm源,以准确了解事物的存储方式。