我正在尝试识别Centos服务器上安装的软件,直到现在我才出现了#39;以下两个基本解决方案
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网站。
答案 0 :(得分:2)
您确实需要使用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源以确定存储的确切方式。
答案 1 :(得分:1)
my(fedora)rpm
命令接受--dbpath
选项以指定其他选项
目录与数据库。还有一个rpm-python
包来从python中操作数据库。