Как извлечь содержимое 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

загрузить:https://github.com/craigwblake/redline/releases


вы можете просто сделать tar -xvf <rpm file> Как хорошо!


в 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.