Ответ 1
Вы попробовали комманду rpm2cpio
? См. Пример ниже:
$ 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
У меня есть rpm, и я хочу рассматривать его как tarball. Я хочу извлечь содержимое в каталог, чтобы я мог проверить содержимое. Я знаком с командами запросов на удаленный пакет. Мне не нужен список содержимого rpm. то есть.
$ rpm -qpl foo.rpm
Я хочу проверить содержимое нескольких файлов, содержащихся в rpm. Я не хочу устанавливать rpm. Я также знаю о возможности rpms делать дополнительные модификации в разделах% post и как их проверять. то есть.
$ rpm -qp --scripts foo.rpm
Однако в этом случае это меня не касается.
Вы попробовали комманду rpm2cpio
? См. Пример ниже:
$ 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 answer
Для тех, у кого нет rpm2cpio, вот древний rpm2cpio.sh script который извлекает полезную нагрузку из пакета *.rpm.
Отправлено для потомков... и следующего поколения.
Вызываем следующее: . /rpm 2cpio.sh.rpm | cpio -dimv
#!/bin/sh
pkg=$1
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 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# 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 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# 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
В большинстве дистрибутивов установлено графическое приложение file-roller, которое распаковывает tar, zip, rpm и многие другие.
file-roller --extract-here package.rpm
Это приведет к извлечению содержимого в текущем каталоге.
Вы также можете просто сделать tar -xvf <rpm file>
!
Мощный текстовый файловый менеджер mc (Midnight Commander, смутно напоминающий команду Norton Commander из старых DOS) имеет встроенную возможность проверки и распаковки файлов .rpm и .rpms, просто "откройте" файл .rpm(s) в mc и выберите CONTENTS.cpio
: для rpm вы получите доступ к дереву установки, для rpms вы получите доступ к файлу .spec и всем исходным пакетам.
7-zip понимает большинство видов архивов, включая rpm и включенный cpio.
Для отладки/проверки ваших rpm я предлагаю использовать redline, который представляет собой 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
Тест "DECOMPRESSION" терпит неудачу на CygWin, одной из наиболее полезных для него платформ, из-за проверки "grep" для "xz", чувствительной к регистру. Результат проверки "COMPRESSION:":
COMPRESSION='/dev/stdin: XZ compressed data'
Просто замена grep -q на "grep -q -i" повсеместно помогает решить проблему.
Я сделал несколько обновлений, особенно добавляя некоторые комментарии и используя "случай" вместо уложенных "if" операторов, и включил это исправление ниже
#!/bin/sh
#
# rpm2cpio.sh - extract 'cpio' contents of RPM
#
# Typical usage: rpm2cpio.sh rpmname | cpio -idmv
#
if [ "$# -ne 1" ]; then
echo "Usage: $0 file.rpm" 1>&2
exit 1
fi
rpm="$1"
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 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# 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 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# 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
В OpenSuse, по крайней мере, команда unrpm
поставляется с пакетом build
.
В подходящей директории (потому что это архивная бомба):
unrpm file.rpm
Скопируйте файл .rpm в отдельную папку, затем выполните следующую команду $ yourfile.rpm | cpio -idmv
7-Zip умеет извлекать содержимое. Он работает так же, как файл tar.gz. Сжатый файл внутри сжатого файла.
В Windows 7 Pro с установленным 7-Zip:
Щелкните правой кнопкой мыши файл rpm. Наведите курсор мыши на 7-Zip в контекстном меню. Выберите извлечение в "имя файла".
Войдите в папку с именем файла.
Щелкните правой кнопкой мыши файл cpio. Наведите курсор мыши на 7-Zip в контекстном меню. Выберите извлечение в "имя файла".
Вы сделали. Папка с именем "filename" содержит извлеченное содержимое для проверки.
Я знаю, что вы, ребята из Linux, презираете, что все стало проще, но в конечном итоге, если вам придется потратить время на поиск решения простой проблемы, подобной этой; эта неэффективность стоит вам денег.
Учитывая тот факт, что вы, ребята из Linux, презираете эффективную простоту, я очень сомневаюсь, что версия 7-Zip для Linux будет делать то же самое точно так же.
Зачем делать это легко, если вы можете сделать глупость и заявить о себе как о гении в то же время?
Просто быть чистым; Я не фанат Windows. Я на самом деле смотрю на переход на Linux. Я просто не мог удержаться от возможности втирать в ваши лица то, что разработчики Windows считают здравым смыслом и лучшими практиками для разработчиков.
Просто будь рад, если я это опубликую, а рядом с тобой не стоит Марк Хармон; Специальный агент Леруа Джетро Гиббс сделал бы тебе пощечину за то, что не использовал свою голову.
Я не знаю, какое правило Гиббса это, но правило таково: Не усложняйте для себя вещи, чем они должны быть.
Теперь мы увидим, кому нужно взять отпуск. Береги себя!