根据 rpm 包名称检查软件是否安装 - Rhel 7 和 Rhel 9

根据 rpm 包名称检查软件是否安装 - Rhel 7 和 Rhel 9

我在本地实验室中运行一台 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.rpmPACKAGE_FILE 文件名这样的命名方案来命名 PACKAGE 是一种惯例,但没有什么可以阻止foo-1.02.1x86_64.rpm包含元数据和安装 PACKAGE 的情况bar-3.21.1.noarch(尽管通常只会发生更细微的差异)。


现在我认为您想要查询 PACKAGE_FILE,查看它提供了什么 PACKAGE(包名称、版本和架构),然后检查 rpm 数据库以查看该版本是否已安装。

或者反过来,检查 rpm 数据库以查看安装了哪些版本的 PACKAGE,然后查看与 PACKAGE_FILE 中的版本相比,该版本是否是较新/相同/较旧的版本。

  1. 根据存储在该文件中的 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 
    
  2. 然后查询 RPM 数据库以查看是否安装了该精确的 PACKAGE:

    rpm -q PACKAGE
    
    rpm -q Package_linux-v12_2_5_1.x86_64 
    

    这可能产生两种结果:

    • package PACKAGE is not installed和 exitcode 1- 当未安装该精确的 PACKAGE(name-version.arch)时
    • PACKAGE和 exitcode 0 - 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
 

相关内容