Проверьте, установлено ли программное обеспечение на основе имени пакета 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.
Запросите 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
Затем запросите базу данных 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