Я работаю на машине, отличной от Redhat, и мне нужно извлечь Версия: x.y.z и Релиз: a.b.c информация из некоторых .rpms, которые проходят через машину.
Обычно можно сделать:
rpm -qip ./Foo.x.y.z.rpm | grep Version | awk ...
Но это не машина на основе Redhat, поэтому у меня нет rpm
и я все равно не хочу устанавливать второй менеджер пакетов.
Я думал, что если бы я сделал:
rpm2cpio ./Foo.x.y.z.rpm | cpio -idmv
Затем, когда был извлечен cpio, я нашел файл с именем .preamble
или что-то, что может содержать данные. Но не повезло. Кто-нибудь знает другой способ?
Пример использования rpm2cpio - извлечение файлов без метаданных, что противоположно тому, что вы хотите. Он, как и другие инструменты, требует связывания с librpm. Даже Midnight Commander, изучающий файл rpm, использует двоичный файл rpm.
В системе с yum используйте createrepo для создания репозитория из этих rpms. XML и sqlite будут сгенерированы с метаданными. Хотя анализировать проще, чем двоичный формат rpm, вам придется писать запросы самостоятельно, если вы не используете yum. Сохраните реподанные, чтобы у вас было функциональное репозиторий yum.
Поднимаясь на еще один уровень абстракции, инструменты жизненного цикла системы включают управление контентом. А именно Katello или Red Hat Satellite. Немного тяжелый по сравнению со сценарием оболочки, но вы можете получить хосты и пакеты, на которые они подписаны, с помощью API.
Просто продолжайте и устанавливайте rpm
. Это самое простое. Он почти наверняка вам доступен в вашем дистрибутиве.
Теперь вы можете использовать форматы запросов RPM для извлечения нужной информации.
Например:
file=/path/to/filename.rpm
name=$(rpm --queryformat "%{name}" -qp $file)
version=$(rpm --queryformat "%{version}" -qp $file)
release=$(rpm --queryformat "%{release}" -qp $file)
echo "This RPM named $name has version $version release $release"