我在本地实验室中运行一台 Rhel7 和一台 Rhel9 服务器。当我列出所有已安装的软件包时,rpm -qa | grep -i package
我得到以下结果:
Package-12.2.5.-1.x86_64
软件包的名称rpm
是:Package_linux_v12_2_5_1.rpm
。
我希望能够使用该名称查询 rpm。这适用于 Rhel9,但不适用于 Rhel7
Rhel9
$ rpm -q Package_linux_v12_2_5_1.rpm
Package_linux_v12_2_5_1.rpm
Rhel7
$ rpm -q Package_linux_v12_2_5_1.rpm
package Package_linux_v12_2_5_1.rpm is not installed
最终目标: 能够使用相同的方法查询两个 Rhel 版本,比较现有版本和要安装的版本并输出包的版本。
编辑:如果使用旧版本安装了 Rhel7rpm
但后来升级了,这还能用吗?
答案1
默认行为rpm {-q|--query}
无需特定选择选项即可查询 RPM 数据库。
rpm 命令的较新版本似乎有所改进,并且认识到rpm -q something.that.ends.in.dot.rpm
使用时您打算查询 PACKAGE_FILE 而不是查询 rpm 数据库。
旧版本没有这种隐式行为。旧版本将something.that.ends.in.dot.rpm
在 RPM 数据库中查找名为 PACKAGE 的软件包(通常不会找到任何东西)。
这是您看到的一个问题/差异。
您可以通过明确指示 rpm 使用 select 选项/命令开关查询包文件来解决这个问题-p, --package
,这应该会导致与所有当前和过去的 rpm 版本一致的行为。因此使用:
rpm -q -p PACKAGE_FILE
查看手册(man rpm
) 查看该rpm
命令在系统上提供的功能和选项。
笔记:您的系统在安装 .rpm 文件时将使用的版本信息来自软件包 rpm 元数据,而不是软件包文件名。
这意味着您不应该评估 PACKAGE_FILE 文件名来确定它提供的 PACKAGE 和 name-version.arch。尽管使用像NAME-version_number.release.arch.rpm
PACKAGE_FILE 文件名这样的命名方案来命名 PACKAGE 是一种惯例,但没有什么可以阻止foo-1.02.1x86_64.rpm
包含元数据和安装 PACKAGE 的情况bar-3.21.1.noarch
(尽管通常只会发生更细微的差异)。
现在我认为您想要查询 PACKAGE_FILE,查看它提供了什么 PACKAGE(包名称、版本和架构),然后检查 rpm 数据库以查看该版本是否已安装。
或者反过来,检查 rpm 数据库以查看安装了哪些版本的 PACKAGE,然后查看与 PACKAGE_FILE 中的版本相比,该版本是否是较新/相同/较旧的版本。
根据存储在该文件中的 rpm 元数据查询 PACKAGE_FILE 以查找其提供的 PACKAGE:
rpm -q -p PACKAGE_FILE rpm -q -p Package_linux_v12_2_5_1.rpm
这通常应该返回 PACKAGE 作为输出,通常是 name-version.arch 字符串,如下所示:
PACKAGE
分别:
Package_linux-v12_2_5_1.x86_64
然后查询 RPM 数据库以查看是否安装了该精确的 PACKAGE:
rpm -q PACKAGE rpm -q Package_linux-v12_2_5_1.x86_64
这可能产生两种结果:
package PACKAGE is not installed
和 exitcode1
- 当未安装该精确的 PACKAGE(name-version.arch)时PACKAGE
和 exitcode0
- PACKAGE 已安装,并显示已安装版本的 (name-version.arch)
现在,为了实现自动化,您可能需要使用--queryformat QUERYFMT
选项来调整查询输出并使用除之外的其他内容name-version.arch
。
例如,我将查询输出限制为仅 PACKAGE_NAME。使用 PACKAGE_NAME 搜索 rpm 数据库将允许我查看另一个版本安装 PACKAGE_FILE,而不是只搜索完全相同的匹配。
rpm -q --queryformat %{NAME} -p PACKAGE_FILE
PACKAGE_NAME=`rpm -q --queryformat %{NAME} -p Package_linux_v12_2_5_1.rpm`
然后当安装一个(或多个)具有该名称的软件包时,搜索 RPM 数据库可能会产生类似的结果:
rpm -q $PACKAGE_NAME
Package_linux-v10_1_3_1.x86_64
Package_linux-v11_2_0_9.x86_64
最终目标:能够使用相同的方法查询两个 RHEL 版本,比较现有版本和要安装的版本并输出包的版本。
在未经测试的伪 shell 脚本中:
#!/bin/bash
PACKAGE_FILE="/path/to/package-version.arch.rpm"
NAME=`rpm -q --queryformat %{NAME} -p $PACKAGE_FILE`
VERSION=`rpm -q --queryformat %{VERSION} -p $PACKAGE_FILE`
PACKAGE=`rpm -q -p $PACKAGE_FILE`
echo "$PACKAGE_FILE provides - $NAME - $VERSION"
# Check if the exact PACKAGE is installed
OUTPUT=`rpm -q $PACKAGE`
if [ $? -eq 0 ]; then
echo "That exact version is already installed."
exit
fi
# Check if a different version of PACKAGE is installed
OUTPUT=`rpm -q $PACKAGE_NAME`
if [ $? -eq 0 ]; then
echo "A different version of $PACKAGE_NAME is installed."
echo "Currently installed is: $OUTPUT"
exit
else
echo "$PACKAGE is not installed."
fi