Проверьте, установлено ли программное обеспечение на основе имени пакета rpm — Rhel 7 и Rhel 9.

У меня в местной лаборатории работают один сервер Rhel7 и один сервер Rhel9. Когда я перечисляю все установленные пакеты,rpm -qa | grep -i packageЯ получаю следующий результат:Package-12.2.5.-1.x86_64

Название пакета:Package_linux_v12_2_5_1.rpm.
Я хочу иметь возможность запрашивать обороты, используя это имя. Это работает для Rhel9, но не для Rel7.

Рел9

      $ rpm -q Package_linux_v12_2_5_1.rpm
Package_linux_v12_2_5_1.rpm

Рел7

      $ rpm -q Package_linux_v12_2_5_1.rpm
package Package_linux_v12_2_5_1.rpm is not installed

Конечная цель: иметь возможность запрашивать обе версии Rhel, используя один и тот же метод, сравнивая существующую версию и ту, которая будет установлена, и выводить версию пакета.

РЕДАКТИРОВАТЬ: работает ли это, если, например, Rhel7 установлен с использованием более старой версии?rpmно был обновлен?

1 ответ

Поведение по умолчанию длябез определенных параметров выбора — это запрос к базе данных RPM.

Новые версии команды rpm, по-видимому, улучшены и признают, что приrpm -q something.that.ends.in.dot.rpmиспользуется для того, чтобы вы намеревались запросить PACKAGE_FILE, а не базу данных rpm.

В более старых версиях такого неявного поведения нет. Более старые версии будут искать ПАКЕТ с именемsomething.that.ends.in.dot.rpmв базе данных RPM (и обычно ничего не находит).

Это одна проблема/отличие, которое вы видите.

Вы можете решить эту проблему, явно указав rpm запросить файл пакета с помощью-p, --packageвыберите опцию/командный переключатель, что должно привести к единообразному поведению со всеми текущими и прошлыми версиями rpm. Итак, используйте:

      rpm -q -p PACKAGE_FILE

Ознакомьтесь с руководством (сrpm {-q|--query}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будет содержать метаданные и установить ПАКЕТbar-3.21.1.noarch(хотя обычно случаются лишь более тонкие различия).


Теперь я думаю , что вы хотите запросить PACKAGE_FILE, посмотреть, какой PACKAGE (имя пакета, версия и архитектура) он предоставляет, а затем проверить базу данных rpm, чтобы узнать, установлена ​​ли эта версия.

Или, наоборот, проверьте базу данных rpm, чтобы узнать, какие версии PACKAGE установлены, а затем посмотрите, является ли это более новой/той же/более старой версией по сравнению с версией в PACKAGE_FILE.

  1. Запросите PACKAGE_FILE для PACKAGE, который он предоставляет, в соответствии с метаданными rpm, хранящимися в этом файле:

            rpm -q -p PACKAGE_FILE
    
    rpm -q -p Package_linux_v12_2_5_1.rpm
    

    Обычно это должно возвращать ПАКЕТ в качестве вывода, обычно строку name-version.arch следующего вида:

            PACKAGE 
    

    соответственно:

            Package_linux-v12_2_5_1.x86_64 
    
  2. Затем запросите базу данных RPM, чтобы узнать, установлен ли именно этот ПАКЕТ:

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

    Это может иметь два результата:

    • package PACKAGE is not installedи код выхода1- когда этот точный ПАКЕТ (имя-версия.arch) не установлен
    • PACKAGEи код выхода0- ПАКЕТ установлен и отображается (имя-версия.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, используя один и тот же метод, сравнивая существующую версию и ту, которая будет установлена, и выводить версию пакета.

В непроверенном скрипте псевдооболочки:

       #!/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
 
Другие вопросы по тегам