识别Centos机器上安装的软件包

Identify installed software packages on Centos machine

我正在尝试识别Centos服务器上安装的软件,目前我'came up'有以下两种基本解决方案

  1. 解析可执行文件和库的文件系统
  2. 运行 类似于 rpm -qa

第一个很费时间,而第二个并不适用于我所有的情况。例如,即使服务器不是 运行,我也想 'search' 包,我只能访问它的文件系统作为远程卷、快照或图像。

我在想的是尝试解析 rpm -qa 从中读取数据的相同数据库/文件。

在 运行 strace -o /tmp/rpm-strace.out rpm -qa 之后,我发现(不确定)/var/lib/rpm/Packages/var/lib/rpm/Names 是 'database' 的一些可能位置,但我不能解析这两个文件中的任何一个。

有谁知道如何解析这些文件?有没有其他方法可以实现我想要的?

注:this 'Unix & Linux'问题所述,整个思路在Ubuntu下是可行的。

免责声明:这个问题可能更适合serverfault网站

您确实需要使用rpm 来解析rpm 数据库。如果您有权访问文件系统,则可以在适当的根上下文中简单地使用 chroot 到 运行 rpm

chroot /my/server/filesystem rpm -qa

这些文件是各种 BerkeleyDB 数据库文件。假设您的 运行time 环境有相同版本的 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 源以弄清楚东西是如何存储的。

my (fedora) rpm 命令接受一个 --dbpath 选项来指定一个不同的 数据库目录。还有一个 rpm-python 包来操作来自 python 的数据库。