Как извлечь содержимое оборотов в минуту?

У меня есть rpm, и я хочу относиться к нему как к тарболу. Я хочу извлечь содержимое в каталог, чтобы я мог проверить содержимое. Я знаком с командами запроса неустановленного пакета. Я не просто хочу список содержимого rpm. т.е.

$ rpm -qpl foo.rpm

Я хочу проверить содержимое нескольких файлов, содержащихся в rpm. Я не хочу устанавливать RPM. Мне также известно о способности rpms вносить дополнительные изменения в разделы% post и о том, как их проверять. т.е.

$ rpm -qp --scripts foo.rpm

Однако в этом случае это меня не касается.

20 ответов

Решение

Вы пробовали 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

Для тех, у кого нет rpm2cpio, вот древний скрипт rpm2cpio.sh, который извлекает полезную нагрузку из пакета *.rpm.

Перемещено для потомков... и следующего поколения.

Вызвать так: ./rpm2cpio.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

В большинстве дистрибутивов установлен файл-ролик приложения с графическим интерфейсом, который распаковывает tar, zip, rpm и многие другие.

file-roller --extract-here package.rpm

Это позволит извлечь содержимое в текущем каталоге.

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

7-zip понимает большинство видов архивов, включая rpm и включенный cpio.

Как сообщается здесь:https://bugzilla.redhat.com/show_bug.cgi?id=2058426

RHEL 9 использует сжатие полезной нагрузки (zstd).

      rpm2cpio foo.rpm | zstd -d | cpio -idmv

Мощный текстовый файловый менеджер mc (Midnight Commander, смутно напоминающий Norton Commander о старых временах DOS) обладает встроенной возможностью проверять и распаковывать файлы.rpm и.rpms, просто "открывая" файл.rpm(s) в MC и выберите CONTENTS.cpio: для RPM вы получаете доступ к дереву установки, для RPM вы получаете доступ к файлу.spec и всем исходным пакетам.

Для отладки / проверки вашего RPM я предлагаю использовать Redline, который является Java-программой

Использование:

java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm

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

В NixOS есть rpmextract, Это обертка вокруг rpm2cpio, именно так, как хотел @Alan Evangelista. https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract

По крайней мере, в OpenSuse unrpm Команда приходит с build пакет.

В подходящем каталоге (потому что это архивная бомба):

unrpm file.rpm

На Manjaro, использующем KDE, Арк может справиться с этим.

Скопируйте файл.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 сочли бы здравым смыслом и передовыми методами разработки.

Просто радуйтесь, что это я публикую, а рядом с вами нет Марка Хармона, потому что; Специальный агент Лерой Джетро Гиббс дал бы вам пощечину за то, что вы не использовали свою голову.

Я не знаю, какое это правило Гиббса, но правило таково: не усложняйте себе жизнь сложнее, чем должно быть.

Теперь посмотрим, кому нужно взять отпуск. Береги себя!

Если в вашей системе естьrpm2archiveустановлен, вы можете запустить:

      rpm2archive package.rpm

Это преобразует пакет rpm в сжатый архив tar.package.rpm.tgz. Теперь вы можете извлечь его, используя:

      tar -xvf package.rpm.tgz

Ранее это отмечал Hi-Angel в своем комментарии.

Источники:

  1. man-страница rpm2archive
  2. Он был выпущен с rpm 4.12.0-alpha (он довольно новый)
  3. В Debian и его производных он включен вrpm2cpioупаковка.

Тест "DECOMPRESSION" не проходит на CygWin, одной из наиболее потенциально полезных платформ для него, из-за проверки "grep" на наличие "xz" с учетом регистра. Результат проверки "СЖАТИЕ:":

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: $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

Если вы попробовалиrpm2cpio.shсценарий выше, и он не сработал, вы можете сохранить следующий сценарий и вызвать его следующим образом:rpm2cpio.sh rpmname | cpio -idmv, на моем работаетCentOS 7.

      #!/bin/sh -efu

fatal() {
    echo "$*" >&2
    exit 1
}

pkg="$1"
[ -n "$pkg" ] && [ -e "$pkg" ] ||
    fatal "No package supplied"

_dd() {
    local o="$1"; shift
    dd if="$pkg" skip="$o" iflag=skip_bytes status=none $*
}

calcsize() {

    case "$(_dd $1 bs=4 count=1 | tr -d '\0')" in
        "$(printf '\216\255\350')"*) ;; # '\x8e\xad\xe8'
        *) fatal "File doesn't look like rpm: $pkg" ;;
    esac

    offset=$(($1 + 8))

    local i b b0 b1 b2 b3 b4 b5 b6 b7

    i=0
    while [ $i -lt 8 ]; do
        # add . to not loose \n
        # strip \0 as it gets dropped with warning otherwise
        b="$(_dd $(($offset + $i)) bs=1 count=1 | tr -d '\0' ; echo .)"
        b=${b%.}    # strip . again

        [ -z "$b" ] &&
            b="0" ||
            b="$(exec printf '%u\n' "'$b")"
        eval "b$i=\$b"
        i=$(($i + 1))
    done

    rsize=$((8 + ((($b0 << 24) + ($b1 << 16) + ($b2 << 8) + $b3) << 4) + ($b4 << 24) + ($b5 << 16) + ($b6 << 8) + $b7))
    offset=$(($offset + $rsize))
}

case "$(_dd 0 bs=4 count=1 | tr -d '\0')" in
    "$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
    *) fatal "File doesn't look like rpm: $pkg" ;;
esac

calcsize 96
sigsize=$rsize

calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
hdrsize=$rsize

case "$(_dd $offset bs=2 count=1 | tr -d '\0')" in
    "$(printf '\102\132')") _dd $offset | bunzip2 ;; # '\x42\x5a'
    "$(printf '\037\213')") _dd $offset | gunzip  ;; # '\x1f\x8b'
    "$(printf '\375\067')") _dd $offset | xzcat   ;; # '\xfd\x37'
    "$(printf '\135')") _dd $offset | unlzma      ;; # '\x5d\x00'
    "$(printf '\050\265')") _dd $offset | unzstd  ;; # '\x28\xb5'
    *) fatal "Unrecognized payload compression format in rpm file: $pkg" ;;
esac

Если у вас естьrpmdevtoolsустановлен, вы также можете извлечь файл пакета RPM с помощью всего одной команды:

      rpmdev-extract foo.rpm

просто запустите это:

      $rpm -ivh package_name.rpm

если у вас нет прав суперпользователя, используйте sudo -iзатем выполните эту команду.
если у вас нет пакета rpm, установите пакет rpm.

Другие вопросы по тегам