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.

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 

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


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

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

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.


6

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


Próbowałem z zamkiem 7 i działa doskonale.
— anshul

5

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


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.




1

Przynajmniej w OpenSuse unrpmpolecenie jest dostarczane z buildpakietem.

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

unrpm file.rpm

1

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


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

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ć!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.