Come estraggo il contenuto di un numero di giri?


154

Ho un numero di giri e voglio trattarlo come un tarball. Voglio estrarre il contenuto in una directory in modo da poterne ispezionare il contenuto. Conosco i comandi di query di un pacchetto disinstallato. Non voglio semplicemente un elenco dei contenuti dell'rpm. vale a dire

$ rpm -qpl foo.rpm

Voglio controllare il contenuto di diversi file contenuti nell'rpm. Non voglio installare l'rpm. Sono anche consapevole della capacità di rpms di apportare ulteriori modifiche nelle sezioni% post e di come verificarle. vale a dire

$ rpm -qp --scripts foo.rpm

Tuttavia, in questo caso ciò non mi preoccupa.

Risposte:


184

Hai provato il rpm2cpiocomandante? Vedi l'esempio seguente:

$ 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
Sono sorpreso che le distribuzioni Linux non forniscano un eseguibile wrapper per semplificare questo compito (ad es. Rpmextract bla.rpm), in quanto si tratta di un'operazione molto comune. L'utente non dovrebbe preoccuparsi del formato cpio intermedio.
Alan Evangelista,

2
Non essere stupito, @AlanEvangelista, questo è normale per il corso.
ngreen

questo richiede l'accesso come root per l'installazione di rpm2cpio :(
törzsmókus

9
@AlanEvangelista Sono sorpreso che rpm abbia un formato così cattivo. Confronto con altri deb simili che sono solo semplici archivi che aderiscono alla filosofia UNIX.
Trismegistos,

1
@SumitMurari Certo che è male. Stavo solo offrendo una soluzione alla situazione di törzsmókus.
MirroredFate

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

Per riferimento: gli argomenti cpio sono

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

Ho trovato la risposta qui: la risposta di lontar


1
"rpm2cpio foo.rpm | cpio -idmv" funziona per me. È sufficiente estrarre il contenuto dell'rpm nel percorso corrente.
Parassita,

32

Per coloro che non hanno rpm2cpio, ecco l'antico script rpm2cpio.sh che estrae il payload da un pacchetto * .rpm.

Ripubblicato per i posteri ... e la prossima generazione.

Invoca in questo modo: ./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

Ottengo questo errore "unlzma: bad lzma header" usando Alpine Linux. Ho provato più rpms.
jekennedy,

27

A volte puoi riscontrare un problema con l'archivio RPM intermedio:

cpio: numero non valido
cpio: numero non valido
cpio: numero non valido
. . .
cpio: fine prematura dell'archivio

Ciò significa che potrebbe essere compresso, al giorno d'oggi è la compressione LZMA2 come al solito, da xz:

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

altrimenti potresti provare:

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

2
l'ho appena incontrato. Grazie!
Sam Stoelinga,

2
Molto utile. Grazie Signore!
ILIV,

1
salvavita. @LasseHalbergHaarbye l'ho aggiunto alla risposta accettata.
Joseph Farah,

Stavo ottenendo gli errori "Numero non valido" e "Fine prematura dell'archivio", ma nessuna delle soluzioni pubblicate ha funzionato per me. Ho dovuto fare rpm2cpio <file>.rpm | bsdtar -xf -(no cpio) per farlo funzionare.
Jackkamm,

L'archivio intermedio ha finito per essere formattato con gzip per me, quindi ho usato gunzipinvece di xzo lzmache ha funzionato bene.
Jayhendren,

9

La maggior parte delle distribuzioni ha installato il file-roller dell'app GUI che decomprime tar, zip, rpm e molti altri.

file-roller --extract-here package.rpm

Questo estrarrà il contenuto nella directory corrente.


6

7-zip comprende la maggior parte dei tipi di archivi, inclusi rpm e cpio incluso.


Ho provato con 7 zip e ha funzionato perfettamente.
anshul

5

Puoi anche semplicemente fare tar -xvf <rpm file>!


Impossibile riprodurlo con un pacchetto .rpm. Potresti voler correggere la tua risposta.
gvlasov,

9
Funziona su OS X - o su qualsiasi altro sistema che utilizza una variante di tarcui si utilizza libarchivesotto il cofano.
Glenjamin,

2
Ho ricevuto l'errore: questo non sembra un archivio tar.
wp-overwatch.com

Questo ha funzionato per me su MacOS 10.14.1 con bsdtar 2.8.3 - libarchive 2.8.3. Potrebbe dipendere dal tipo di compressione utilizzato. Lo script rpm2cpio.sh sembra controllare diversi tipi di compressione prima di passarlo allo strumento giusto per l'estrazione.
2xj

Poiché la funzionalità di modifica di SO non mi consente di aggiungere 3 caratteri per correggere la risposta, è necessario aggiungere che ciò richiede libarchive bsdtar. Homebrew su Mac si collega tarad esso per impostazione predefinita, ma su altri sistemi operativi tarsignifica tar GNU.
Atemu,

5

Il potente file manager basato su testo mc (Midnight Commander, che ricorda vagamente il Norton Commander dei vecchi tempi DOS) ha la capacità integrata di ispezionare e decomprimere i file .rpm e .rpms, semplicemente "aprire" il file .rpm (s) all'interno di mc e seleziona CONTENTS.cpio: per un rpm hai accesso all'albero di installazione, per un rpms hai accesso al file .spec e a tutti i pacchetti sorgente.




1

Almeno in OpenSuse, il unrpmcomando viene fornito con il buildpacchetto.

In una directory adatta (perché questa è una bomba dell'archivio):

unrpm file.rpm

1

Copia il file .rpm in una cartella separata, quindi esegui il seguente comando $ yourfile.rpm | cpio -idmv


questo dovrebbe essere un commento
ketan,

1

Il test "DECOMPRESSION" non riesce su CygWin, una delle piattaforme più utili per questo, a causa del controllo "grep" per "xz" sensibile al maiuscolo / minuscolo. Il risultato del controllo "COMPRESSIONE:" è:

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

La semplice sostituzione di 'grep -q' con 'grep -q -i' ovunque sembra risolvere bene il problema.

Ho fatto alcuni aggiornamenti, in particolare aggiungendo alcuni commenti e usando "case" invece delle istruzioni "if" impilate, e ho incluso quella correzione di seguito

#!/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 è in grado di estrarre il contenuto. Funziona allo stesso modo di un file tar.gz. Un file compresso all'interno di un file compresso.

Su Windows 7 Pro con 7-Zip installato:

Fare clic con il tasto destro del mouse sul file rpm. Passa il mouse su 7-Zip nel menu contestuale. Seleziona estrai in "nome file".

Entra nella cartella del nome file.

Fare clic con il tasto destro sul file cpio. Passa il mouse su 7-Zip nel menu contestuale. Seleziona estrai in "nome file".

Hai fatto. La cartella con "nome file" contiene i contenuti estratti per l'ispezione.

So che voi ragazzi di Linux disprezzate che le cose siano rese facili, ma a lungo termine, se dovete passare il tempo a cercare una soluzione a un problema semplice come questo; quell'inefficienza ti sta costando soldi.

Dato che voi ragazzi di Linux disprezzate la semplicità efficiente, dubito fortemente che la versione Linux di 7-Zip farà la stessa cosa nello stesso identico modo.

Perché renderlo facile quando puoi rendere davvero stupido e dichiarare di essere un genio allo stesso tempo?

Giusto per essere chiari; Non sono un fan di Windows. In realtà sto cercando di passare a Linux. Non ho potuto resistere all'opportunità di strofinare ciò che gli sviluppatori di Windows vedrebbero come buonsenso, le migliori pratiche degli sviluppatori sui tuoi volti.

Sii contento che sia io a pubblicarlo e non hai Mark Harmon in piedi accanto alla tua causa; L'agente speciale Leroy Jethro Gibbs ti avrebbe dato uno schiaffo per non aver usato la testa.

Non so quale sia la regola di Gibbs, ma la regola è: non rendere le cose più difficili per te di quanto debbano essere.

Ora vediamo chi deve fare una vacanza. Stai attento!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.