如何阅读 var/lib/rpm/Packages 内容

How to read var/lib/rpm/Packages content

我在基于 Centos:8 的映像中的路径 var/lib/rpm 中有“Packages”文件。 我如何读取/获取“Packages”文件内容

正如我在一些文档中所读到的,该文件属于 berkeley DB 类型。对此我不确定。

Berkeley DB 是一个嵌入式数据库,运行在应用程序中。存储在其中的所有数据都是二进制格式,特定于将其存储在那里的应用程序。访问数据的最佳选择始终是使用应用程序本身 - 在您的情况下,RPM。

如果您必须做一些非常特别的事情,最好的选择可能是拉下 RPM 的源代码并修改它以执行您想要的操作。

如果您还没有在您的系统上安装它,有一个 db_dump 程序随 Berkeley DB 一起分发。您可以在 RPM 数据库上 运行 它。但由于数据都是二进制的,您需要参考 RPM 源代码来弄清楚如何解释它。

正如 Mike Andrews 所写,使用 rpm。

例如你可以使用这个:

$> cd /wherever/you/put/your/Packages/file

$> rpm -qa --last --dbpath $PWD

$> rpm -qa --last --dbpath /wherever/you/put/your/Packages/file

xorg-x11-drv-ati-firmware-7.1.0-3.el6.noarch  Fri Nov 29 17:53:35 2013
ql2100-firmware-1.19.38-3.1.el6.noarch        Fri Nov 29 17:53:35 2013
...

您可以像下面这样使用 "rpm" python 库,它输出与

相同的结果
rpm -qa --dbpath /some/path/to/rpm/db

JSON格式

您现在可以忽略 _db_backend,因为它的唯一值是 "bdb"

import sys
import rpm
import json

if (len(sys.argv) != 3):
    print ('invalid amount of input arguments!')
    sys.exit()

# user inputs
dbtype = sys.argv[1]
dbpath = sys.argv[2]

# add macro to be used by rpm
rpm.addMacro("_db_backend", dbtype)
rpm.addMacro("_dbpath", dbpath)

# Open database
ts = rpm.TransactionSet()
ts.openDB()

# remove macro for future cases
rpm.delMacro("_db_backend")
rpm.delMacro("_dbpath")

allPackages = []
# retrieve all packages from BDB
mi = ts.dbMatch()

# build JSON object from all packages for easier parsing
for hdr in mi:
    pkgDict = {}
    allPackages.append(pkgDict)
    pkgDict['NAME'] = hdr[rpm.RPMTAG_NAME]
    pkgDict['VERSION'] = hdr[rpm.RPMTAG_VERSION]
    pkgDict['RELEASE'] = hdr[rpm.RPMTAG_RELEASE]
    pkgDict['ARCH'] = hdr[rpm.RPMTAG_ARCH]

print (json.dumps(allPackages))