【发布时间】:2021-12-17 17:27:36
【问题描述】:
我在基于 Centos:8 的映像的路径 var/lib/rpm 中有“Packages”文件。 如何读取/获取“Packages”文件内容
我在一些文档中读到这个文件的类型是 berkeley DB.. 对此不确定。
【问题讨论】:
标签: linux centos fedora rhel berkeley-db
我在基于 Centos:8 的映像的路径 var/lib/rpm 中有“Packages”文件。 如何读取/获取“Packages”文件内容
我在一些文档中读到这个文件的类型是 berkeley DB.. 对此不确定。
【问题讨论】:
标签: linux centos fedora rhel berkeley-db
您可以使用下面的“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))
【讨论】:
Berkeley DB 是在应用程序内部运行的嵌入式数据库。存储在其中的所有数据都是二进制格式,特定于存储它的应用程序。访问数据的最佳选择始终是使用应用程序本身 - 在您的情况下是 RPM。
如果您必须做一些非常特别的事情,您最好的选择可能是下载 RPM 的源代码并对其进行修改以做您想做的事情。
如果您的系统上还没有安装它,那么有一个随 Berkeley DB 分发的 db_dump 程序。您可以在 RPM 数据库上运行它。但是由于数据都是二进制的,你需要参考 RPM 源代码来弄清楚如何解释它。
【讨论】:
rpm 程序本身是否使用其命令行选项执行您想要的操作。做man 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
...
【讨论】: