我正在尝试识别 Centos 服务器上安装的软件,到目前为止我“想出了”以下两个基本解决方案
- 解析文件系统中的可执行文件和库
- 运行类似
rpm -qa
第一个很耗时,而第二个并不适用于我的所有案例。例如,即使服务器没有运行,我也想“搜索”包,并且我只能将其文件系统作为远程卷、快照或图像进行访问。
我的想法是尝试解析 rpm -qa
从中读取数据的相同数据库/文件。
运行 strace -o/tmp/rpm-strace.out rpm -qa
后,我发现(不确定)/var/lib/rpm/Packages
和 /var/lib/rpm/Names
是该“数据库”的一些可能位置,但我无法解析这两个文件中的任何一个。
有人知道如何解析这些文件吗?有其他选择可以实现我想要的吗?
注意:整个想法在 Ubuntu 下是可行的,如 this 'Unix & Linux'问题描述。
免责声明:这个问题可能更适合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 源才能准确了解内容的存储方式。
关于linux - 识别 Centos 机器上已安装的软件包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32524085/