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

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 
linux_fanatic
источник
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

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

Erik
источник
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 и всем исходным пакетам.

Давиде Чезари
источник
3

Для отладки / проверки вашего 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

Ронан Киллевер
источник
1

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

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

unrpm file.rpm
user2394284
источник
1

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

apurbojha
источник
это должен быть комментарий
кетан
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 считают здравым смыслом и лучшими практиками для разработчиков.

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

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

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

Скотт Тови
источник