Как извлечь содержимое rpm?
у меня есть rpm, и я хочу относиться к нему как к мячу. Я хочу извлечь содержимое в каталог, чтобы я мог проверить содержимое. Я знаком с командами запроса удаленного пакета. Я не просто хочу список содержимого rpm. т. е.
$ rpm -qpl foo.rpm
Я хочу проверить содержимое нескольких файлов, содержащихся в rpm. Я не хочу устанавливать rpm. Я тоже в курсе МЗП возможность делать дополнительные modifictions в %пост разделы, и как их проверить. т. е.
$ rpm -qp --scripts foo.rpm
однако в этом случае это меня не касается.
13 ответов
вы пробовали rpm2cpio
commmand? См. пример ниже:
$ rpm2cpio php-5.1.4-1.esp1.x86_64.rpm | cpio -idmv
/etc/httpd/conf.d/php.conf
./etc/php.d
./etc/php.ini
./usr/bin/php
./usr/bin/php-cgi
etc
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find .
Для справки: аргументы cpio являются
-i = extract
-d = make directories
-m = preserve modification time
-v = verbose
Я нашел ответ здесь: lontar по
для тех, у кого нет rpm2cpio, вот древний rpm2cpio.sh сценарий что извлекает полезные данные из *.rpm-пакет.
Перепечатано для потомков ... и следующего поколения.
вызвать следующим образом: ./rpm2cpio.sh .об / мин | команда cpio -димв
#!/bin/sh
pkg=
if [ "$pkg" = "" -o ! -e "$pkg" ]; then
echo "no package supplied" 1>&2
exit 1
fi
leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
dl=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
# echo "sig il: $il dl: $dl"
sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
dl=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
# echo "hdr il: $il dl: $dl"
hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`
EXTRACTOR="dd if=$pkg ibs=$o skip=1"
COMPRESSION=`($EXTRACTOR |file -) 2>/dev/null`
if echo $COMPRESSION |grep -q gzip; then
DECOMPRESSOR=gunzip
elif echo $COMPRESSION |grep -q bzip2; then
DECOMPRESSOR=bunzip2
elif echo $COMPRESSION |grep -iq xz; then # xz and XZ safe
DECOMPRESSOR=unxz
elif echo $COMPRESSION |grep -q cpio; then
DECOMPRESSOR=cat
else
# Most versions of file don't support LZMA, therefore we assume
# anything not detected is LZMA
DECOMPRESSOR=`which unlzma 2>/dev/null`
case "$DECOMPRESSOR" in
/* ) ;;
* ) DECOMPRESSOR=`which lzmash 2>/dev/null`
case "$DECOMPRESSOR" in
/* ) DECOMPRESSOR="lzmash -d -c" ;;
* ) DECOMPRESSOR=cat ;;
esac
;;
esac
fi
$EXTRACTOR 2>/dev/null | $DECOMPRESSOR
иногда вы можете столкнуться с проблемой с промежуточным архивом RPM:
cpio: деформированное число
cpio: искаженное число
cpio: искаженное число
. . .
cpio: преждевременный конец архива
это означает, что он может быть упакован, в эти дни это сжатие LZMA2, как обычно,xz
:
rpm2cpio <file>.rpm | xz -d | cpio -idmv
в противном случае вы могли бы попробовать:
rpm2cpio <file>.rpm | lzma -d | cpio -idmv
большинство дистрибутивов установили приложение GUI который распаковывает tar, zip, rpm и многое другое.
file-roller --extract-here package.rpm
это извлечет содержимое в текущем каталоге.
мощный текстовый файловый менеджер mc (Midnight Commander, смутно напоминающий Norton Commander старых времен DOS) имеет встроенную возможность проверки и распаковки .rpm и .rpms файлы, просто "открыть".rpm (s) файл в mc и выберите CONTENTS.cpio
: для rpm вы получаете доступ к дереву установки, для rpms вы получаете доступ к .Spec-файл и все исходные пакеты.
для отладки / проверки Вашего rpm я предлагаю использовать редлайн который является java-программой
использование :
java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm
в NixOS, есть rpmextract
. Это обертка вокруг rpm2cpio, точно так, как хотел @Alan Evangelista.
https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract
в openSUSE, по крайней мере,unrpm
команда поставляется с build
пакета.
в подходящем каталоге (потому что это архивная бомба):
unrpm file.rpm
скопировать .файл rpm в отдельной папке, затем выполните следующую команду $ с yourfile.об / мин | команда cpio -idmv
тест " декомпрессия "терпит неудачу на CygWin, одной из наиболее потенциально полезных платформ для него, из-за проверки" grep "на" xz " с учетом регистра. Результатом проверки" COMPRESSION: "является:
COMPRESSION='/dev/stdin: XZ compressed data'
просто замена "grep-q" на "grep-q-i" везде, кажется, хорошо решает проблему.
Я сделал несколько обновлений, особенно добавив некоторые комментарии и используя "case" вместо сложенных операторов "if", и включил это исправление ниже
#!/bin/sh
#
# rpm2cpio.sh - extract 'cpio' contents of RPM
#
# Typical usage: rpm2cpio.sh rpmname | cpio -idmv
#
if [ "$# -ne 1" ]; then
echo "Usage: file.rpm" 1>&2
exit 1
fi
rpm=""
if [ -e "$rpm" ]; then
echo "Error: missing $rpm"
fi
leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $rpm`
il=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
dl=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
# echo "sig il: $il dl: $dl"
sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $rpm`
il=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
dl=`expr 256 \* \( 256 \* \( 256 \* + \) + \) + `
# echo "hdr il: $il dl: $dl"
hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`
EXTRACTOR="dd if=$rpm ibs=$o skip=1"
COMPRESSION=`($EXTRACTOR |file -) 2>/dev/null`
DECOMPRESSOR="cat"
case $COMPRESSION in
*gzip*|*GZIP*)
DECOMPRESSOR=gunzip
;;
*bzip2*|*BZIP2*)
DECOMPRESSOR=bunzip2
;;
*xz*|*XZ*)
DECOMPRESSOR=unxz
;;
*cpio*|*cpio*)
;;
*)
# Most versions of file don't support LZMA, therefore we assume
# anything not detected is LZMA
DECOMPRESSOR="`which unlzma 2>/dev/null`"
case "$DECOMPRESSOR" in
/*)
DECOMPRESSOR="$DECOMPRESSOR"
;;
*)
DECOMPRESSOR=`which lzmash 2>/dev/null`
case "$DECOMPRESSOR" in
/* )
DECOMPRESSOR="lzmash -d -c"
;;
* )
echo "Warning: DECOMPRESSOR not found, assuming 'cat'" 1>&2
;;
esac
;;
esac
esac
$EXTRACTOR 2>/dev/null | $DECOMPRESSOR
7-zip понимает большинство видов архивов, включая rpm и включенный cpio.