Jak wyodrębnić zawartość pliku rpm?

154

Mam rpm i chcę traktować go jak archiwum. Chcę wyodrębnić zawartość do katalogu, aby móc sprawdzić zawartość. Jestem zaznajomiony z poleceniami odpytywania odinstalowanego pakietu. Nie chcę po prostu listy zawartości rpm. to znaczy

$ rpm -qpl foo.rpm

Chcę sprawdzić zawartość kilku plików zawartych w rpm. Nie chcę instalować rpm. Zdaję sobie również sprawę z możliwości rpms do wprowadzania dodatkowych modyfikacji w sekcjach postów% i jak to sprawdzić. to znaczy

$ rpm -qp --scripts foo.rpm

Jednak w tym przypadku mnie to nie obchodzi.

Jeff Sheffield
źródło

Odpowiedzi:

184

Czy próbowałeś rpm2cpiopolecenia? Zobacz poniższy przykład:

$ 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
źródło
28
Jestem zdumiony, że dystrybucje Linuksa nie zapewniają pliku wykonywalnego opakowania, aby to ułatwić (np. Rpmextract bla.rpm), ponieważ jest to bardzo powszechna operacja. Użytkownik nie powinien martwić się o pośredni format cpio.
Alan Evangelista
2
Nie zdziw się, @AlanEvangelista, to jest normalne dla kursu.
ngreen
to wymaga uprawnień administratora do zainstalowania rpm2cpio :(
törzsmókus
9
@AlanEvangelista Jestem zdumiony, że rpm to taki zły format. W porównaniu do innych, takich jak deb, które są po prostu prostymi archiwami zgodnymi z filozofią UNIX.
Trismegistos
1
@SumitMurari Oczywiście, że jest źle. Właśnie oferowałem rozwiązanie kłopotliwej sytuacji Törzsmókusa.
MirroredFate
66
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

Dla odniesienia: argumenty cpio to

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

Znalazłem odpowiedź tutaj: odpowiedź Lontara

Jeff Sheffield
źródło
1
U mnie działa „rpm2cpio foo.rpm | cpio -idmv”. Wystarczy wyodrębnić zawartość rpm na bieżącej ścieżce.
parasrish
32

Dla tych, którzy nie mają rpm2cpio, oto starożytny skrypt rpm2cpio.sh, który wyodrębnia ładunek z pakietu * .rpm.

Udostępnione dla potomności… i dla następnego pokolenia.

Wywołaj w ten sposób: ./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
Jeff Johnson
źródło
Podczas korzystania z Alpine Linux pojawia się ten błąd „unlzma: zły nagłówek lzma”. Próbowałem wielu obrotów na minutę.
jekennedy
27

Czasami można napotkać problem z pośrednim archiwum RPM:

cpio: Zniekształcony numer
cpio: Zniekształcony numer
cpio: Zniekształcony numer
. . .
cpio: przedwczesne zakończenie archiwum

Oznacza to, że można go spakować, obecnie jest to jak zwykle kompresja LZMA2, przez xz:

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

w przeciwnym razie możesz spróbować:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv
wieża
źródło
2
właśnie to spotkałem. Dzięki!
Sam Stoelinga
2
Bardzo przydatne. Dziękuję Panu!
ILIV
1
ratownik. @LasseHalbergHaarbye dodałem go do zaakceptowanej odpowiedzi.
Joseph Farah,
Otrzymywałem błędy „Zniekształcony numer” i „Przedwczesny koniec archiwum”, ale żadne z opublikowanych rozwiązań nie zadziałało. Musiałem zrobić rpm2cpio <file>.rpm | bsdtar -xf -(bez cpio), żeby to zadziałało.
jackkamm
Archiwum pośrednie zostało dla mnie sformatowane za pomocą gzip, więc użyłem gunzipzamiast xzlub lzmaktóre działało dobrze.
jayhendren
9

Większość dystrybucji zainstalowała rolkę plików aplikacji GUI, która rozpakowuje pliki tar, zip, rpm i wiele innych.

file-roller --extract-here package.rpm

Spowoduje to wyodrębnienie zawartości z bieżącego katalogu.

erik
źródło
6

7-zip obsługuje większość rodzajów archiwów, w tym rpm i dołączony procesor cpio.

Jan Hudec
źródło
Próbowałem z zamkiem 7 i działa doskonale.
anshul
5

Po prostu możesz to zrobić tar -xvf <rpm file>!

Melisa
źródło
Nie można tego odtworzyć za pomocą pakietu .rpm. Możesz chcieć poprawić swoją odpowiedź.
gvlasov
9
Działa to na OS X - lub każdym innym systemie, który używa wariantu, tarktórego używa libarchivepod maską.
Glenjamin
2
Pojawił się błąd: to nie wygląda na archiwum tar.
wp-overwatch.com
To działało dla mnie na MacOS 10.14.1 z bsdtar 2.8.3 - libarchive 2.8.3. Może to zależeć od użytego rodzaju kompresji. Wydaje się, że skrypt rpm2cpio.sh sprawdza kilka typów kompresji przed przekazaniem go do odpowiedniego narzędzia do ekstrakcji.
2xj
Ponieważ funkcja edycji SO nie pozwala mi dodać 3 znaków, aby poprawić odpowiedź, należy dodać, że wymaga to biblioteki libarchive bsdtar. Homebrew na Macu tardomyślnie łączy się z nim, ale w innych systemach operacyjnych taroznacza GNU tar.
Atemu
5

Potężny menedżer plików tekstowych mc (Midnight Commander, niejasno przypominający Norton Commanderowi z dawnych czasów DOS) ma wbudowaną możliwość sprawdzania i rozpakowywania plików .rpm i .rpms, po prostu „otwiera” plik .rpm (s) w mc i wybierz CONTENTS.cpio: dla rpm uzyskasz dostęp do drzewa instalacji, dla RPMS uzyskasz dostęp do pliku .spec i wszystkich pakietów źródłowych.

Davide Cesari
źródło
1

Przynajmniej w OpenSuse unrpmpolecenie jest dostarczane z buildpakietem.

W odpowiednim katalogu (ponieważ jest to bomba archiwalna):

unrpm file.rpm
user2394284
źródło
1

Skopiuj plik .rpm do oddzielnego folderu, a następnie uruchom następującą komendę $ yourfile.rpm | cpio -idmv

apurbojha
źródło
to powinien być komentarz
ketan
1

Test „DECOMPRESSION” kończy się niepowodzeniem na CygWin, jednej z najbardziej użytecznych platform do tego celu, ponieważ sprawdzanie „grep” dla „xz” uwzględnia wielkość liter. Wynikiem sprawdzenia „COMPRESSION:” jest:

COMPRESSION='/dev/stdin: XZ compressed data'

Zwykłe zastąpienie „grep -q” przez „grep -q -i” wszędzie wydaje się dobrze rozwiązać problem.

Dokonałem kilku aktualizacji, w szczególności dodałem kilka komentarzy i użyłem „case” zamiast zestawionych instrukcji „if”, i zamieściłem tę poprawkę poniżej

#!/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
Nico Kadel-Garcia
źródło
1

7-Zip jest w stanie wyodrębnić zawartość. Działa w taki sam sposób, jak działa plik tar.gz. Skompresowany plik w skompresowanym pliku.

W systemie Windows 7 Pro z zainstalowanym 7-Zip:

Kliknij prawym przyciskiem myszy plik rpm. Najedź myszą na 7-Zip w menu kontekstowym. Wybierz wypakuj do „nazwy pliku”.

Wejdź do folderu nazw plików.

Kliknij prawym przyciskiem myszy plik cpio. Najedź myszą na 7-Zip w menu kontekstowym. Wybierz wypakuj do „nazwy pliku”.

Skończyłeś. Folder z „nazwą pliku” zawiera wyodrębnioną zawartość do sprawdzenia.

Wiem, że wy, Linuxowcy, gardzicie prostotą, ale na dłuższą metę, jeśli musicie spędzić czas na szukaniu rozwiązania takiego prostego problemu; że nieefektywność kosztuje.

Biorąc pod uwagę fakt, że wy, Linuxowcy gardzicie wydajną prostotą, bardzo wątpię, czy wersja 7-Zip dla Linuksa zrobi to samo w dokładnie taki sam sposób.

Po co to ułatwiać, skoro możesz uczynić wręcz głupimi trudnymi i jednocześnie twierdzić, że jesteś geniuszem?

Żeby było jasne; Nie jestem fanem Windowsa. Właściwie zamierzam przejść na Linuksa. Po prostu nie mogłem oprzeć się okazji, by wcielić w Twoje twarze to, co deweloperzy Windows uznaliby za zdrowy rozsądek, najlepsze praktyki deweloperów.

Po prostu ciesz się, że to ja publikuję, a nie masz obok siebie Marka Harmona, bo; Agent specjalny Leroy Jethro Gibbs zrobiłby ci uderzenie w głowę za to, że nie używasz głowy.

Nie wiem, która to reguła Gibbsa, ale zasada jest taka: nie rób sobie rzeczy trudniejszych niż to konieczne.

Teraz możemy zobaczyć, kto musi wyjechać na wakacje. Dbać!

Scott Tovey
źródło