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


154

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

$ rpm -qpl foo.rpm

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

$ rpm -qp --scripts foo.rpm

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

Ответы:


184

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

28
Я поражен, что дистрибутивы Linux не предоставляют исполняемый файл-обертку, чтобы сделать это проще (например, rpmextract bla.rpm), так как это очень распространенная операция. Пользователю не нужно заботиться о промежуточном формате cpio.
— Алан Евангелиста

2
Не удивляйтесь, @AlanEvangelista, это для курса.
— ngreen

для установки rpm2cpio требуется доступ с правами root :(
— törzsmókus

9
@AlanEvangelista Я поражен тем, что rpm такой плохой формат. По сравнению с другими подобными deb, которые являются простыми архивами, придерживающимися философии UNIX.
— Трисмегистос

1
@SumitMurari Конечно, это плохо. Я просто предлагал решение проблемы törzsmókus.
— MirroredFate

66
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

Для справки: аргументы cpio

-i = extract
-d = make directories
-m = preserve modification time
-v = verbose

Я нашел ответ здесь: ответ Lontar


1
"rpm2cpio foo.rpm | cpio -idmv" работает для меня. Достаточно извлечь содержимое оборотов на текущем пути.
— parasrish

32

Для тех, у кого нет 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

Я получаю эту ошибку "unlzma: bad lzma header", используя Alpine Linux. Пробовал несколько оборотов.
— Джекеннеди

27

Иногда вы можете столкнуться с проблемой с промежуточным архивом RPM:

cpio: искаженное число
cpio: искаженное число
cpio: искаженное число
. , ,
cpio: преждевременное завершение архива

Это означает, что он может быть упакован, в наши дни это обычное сжатие LZMA2 xz:

rpm2cpio <file>.rpm | xz -d | cpio -idmv

в противном случае вы можете попробовать:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv

2
Я только что столкнулся с этим. Спасибо!
— Сэм Стоилинга

2
Очень полезно. Спасибо, сэр!
— ILIV

1
спасатель. @LasseHalbergHaarbye я добавил это к принятому ответу.
— Джозеф Фарах

Я получал ошибки «Неверное число» и «преждевременное завершение архива», но ни одно из опубликованных решений не помогло мне. Я должен был сделать rpm2cpio <file>.rpm | bsdtar -xf -(без cpio), чтобы это работало.
— Jackkamm

Промежуточный архив оказался для меня в gzip-формате, так что я использовал gunzipвместо xzили lzmaкоторый работал нормально.
— Джейхендрен

9

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

file-roller --extract-here package.rpm

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


6

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


Я попробовал с 7 почтовыми индексами, и это отлично работало.
— Аншул

5

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


Невозможно воспроизвести это с пакетом .rpm. Возможно, вы захотите исправить свой ответ.
— Гвласов

9
Это работает на OS X - или любой другой системе, которая использует вариант, tarкоторый использует libarchiveпод капотом.
— Гленжамин

2
Я получил ошибку: это не похоже на архив tar.
— wp-overwatch.com

Это работало для меня на MacOS 10.14.1 с bsdtar 2.8.3 - libarchive 2.8.3. Это может зависеть от того, какой тип сжатия использовался. Сценарий rpm2cpio.sh, кажется, проверяет несколько типов сжатия, прежде чем передать его нужному инструменту для извлечения.
— 2xj

Так как функция редактирования SO не позволяет мне добавлять 3 символа, чтобы исправить ответ, следует добавить, что для этого требуется библиотека bsdtar. Homebrew на Mac ссылается tarна него по умолчанию, но в других ОС tarозначает GNU tar.
— Atemu

5

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




1

По крайней мере, в OpenSuse unrpmкоманда поставляется сbuild пакетом.

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

unrpm file.rpm

1

Скопируйте файл .rpm в отдельную папку, затем выполните следующую команду $ yourfile.rpm | cpio -idmv


это должен быть комментарий
— кетан

1

Тест «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

1

7-Zip умеет извлекать содержимое. Он работает так же, как и файл tar.gz. Сжатый файл внутри сжатого файла.

В Windows 7 Pro с установленным 7-Zip:

Щелкните правой кнопкой мыши файл rpm. Наведите курсор мыши на 7-Zip в контекстном меню. Выберите извлечение в «имя файла».

Войдите в папку с именем файла.

Щелкните правой кнопкой мыши файл cpio. Наведите курсор мыши на 7-Zip в контекстном меню. Выберите извлечение в «имя файла».

Вы сделали. Папка с «filename» содержит извлеченное содержимое для проверки.

Я знаю, что вы, ребята из Linux, презираете, что все стало проще, но в конечном итоге, если вам придется потратить время на поиск решения простой проблемы, подобной этой; эта неэффективность стоит вам денег.

Учитывая тот факт, что вы, ребята из Linux, презираете эффективную простоту, я очень сомневаюсь, что версия 7-Zip для Linux будет делать то же самое точно так же.

Зачем делать это легко, если вы можете сделать глупость и заявить о себе как о гении одновременно?

Просто быть чистым; Я не фанат Windows. Я на самом деле смотрю на переход на Linux. Я просто не мог удержаться от возможности втирать в ваши лица то, что разработчики Windows считают здравым смыслом и лучшими практиками для разработчиков.

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.