Як витягнути вміст обертів?


154

У мене є оберт, і я хочу ставитися до цього, як до тарболу. Я хочу витягнути вміст у каталог, щоб я міг його перевірити. Мені знайомі команди запитів видаленого пакету. Я не просто хочу список вмісту rpm. тобто

$ rpm -qpl foo.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 :(
törzsmókus

9
@AlanEvangelista Я вражений, що rpm - це такий поганий формат. У порівнянні з іншими подібними дебю, які є просто простими архівами, дотримуючись філософії 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

Тут я знайшов відповідь: відповідь лонтара


1
"rpm2cpio foo.rpm | cpio -idmv" працює для мене. Достатньо витягнути вміст обертів на поточному шляху.
парашут

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. Спробував кілька об / хв.
jekennedy

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який працював чудово.
jayhendren

9

Більшість дистрибутивів встановили файл-ролик додатка GUI, який розпаковує tar, zip, rpm та багато іншого.

file-roller --extract-here package.rpm

Це вилучить вміст у поточному каталозі.


6

7-zip розуміє більшість видів архівів, включаючи rpm та доданий cpio.


Я спробував з 7 блискавками, і це прекрасно спрацювало.
anshul

5

Ви можете просто зробити tar -xvf <rpm file>так само!


Неможливо відтворити це за допомогою пакету .rpm. Ви можете виправити свою відповідь.
гвласов

9
Це працює в OS X - або будь-якій іншій системі, яка використовує варіант, tarякий використовується libarchiveпід кришкою.
Гленджамін

2
Я отримав помилку: це не схоже на архів дьогтю.
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означає tar GNU.
Атему

5

Потужний текстовий файловий менеджер mc (Midnight 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 у контекстному меню. Виберіть витяг до "ім'я файлу".

Ви закінчили. Папка з "ім'ям файлу" містить витягнутий вміст для перевірки.

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

Враховуючи той факт, що ви, хлопці Linux, зневажаєте ефективну простоту, я дуже сумніваюся, що версія Linux 7-Zip зробить те саме саме так.

Навіщо робити це легко, коли ти можеш зробити дурненьке відверто і одночасно претендувати на генія?

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

Тільки радійте, що я це розміщую і у вас немає Марка Хармона, який стоїть поруч із вами; Спеціальний агент Лерой Детро Гіббс зробив би вам шапку по голові за те, що не використовуєте голову.

Я не знаю, яке це правило Гіббса, але це правило: Не робіть для себе складніше, ніж вони повинні бути.

Тепер ми розбираємося, кому потрібно взяти відпустку. Піклуватися!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.