GNU/Linux >> Linux Esercitazione >  >> Linux

Come estraggo il contenuto di un rpm?

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 per la prossima generazione.

Invocare 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

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

cpio:numero malformato
cpio:numero malformato
cpio:numero malformato
. . .
cpio:fine prematura dell'archivio

Ciò significa che potrebbe essere pieno, in questi giorni è la compressione LZMA2 come al solito, entro xz :

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

altrimenti potresti provare:

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

$ 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


Hai provato il rpm2cpio comando? Guarda l'esempio qui sotto:

$ 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
  1. Come creare pacchetti rpm

  2. Come estrarre il file tar.gz in Linux utilizzando la riga di comando

  3. Come ottenere il contenuto di una pagina Web in una variabile di shell?

  4. Come conoscere il valore della macro incorporata in RPM?

  5. Come cancellare il contenuto di un file dalla riga di comando?

Come utilizzare il comando RPM (con esempi)

Come elencare il contenuto di un pacchetto in Linux

Come visualizzare il contenuto di un archivio o di un file compresso in Linux

Come installare Spotify su Fedora 23 in modo semplice

Come impostare il nome host Pretty

Come utilizzare il comando RPM in Linux