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

标签 linux centos rpm

我正在尝试识别 Centos 服务器上安装的软件,到目前为止我“想出了”以下两个基本解决方案

  1. 解析文件系统中的可执行文件和库
  2. 运行类似 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/

相关文章:

linux - 解析分数报告并提取分数总和和平均值

openssl - 在@INC 中安装openssl 3.0.1 : "Can' t locate IPC/Cmd. pm 时出错”

centos - Docker:ping:未知主机 yahoo.com

php - Exec ("adduser myownuser") 无法在 CentOS 服务器上工作

python - Linux 和 Windows 上标准输出的缓冲差异

centos - 安装 automake 1.14 时,glib2 build 找不到 automake 1.13

centos - 无法搜索源 RPM - 它在 repo 上,为什么我找不到它

linux - centos 7 发行版的理想 puppet 存储库

redhat - 如何设置rpmbuild目标文件夹

c++ - 我们可以在 Sockets Map 上使用读写锁吗?