182 votes

Comment extraire le contenu d'un rpm ?

J'ai un rpm et je veux le traiter comme un tarball. Je veux extraire le contenu dans un répertoire afin de pouvoir l'inspecter. Je suis familier avec les commandes d'interrogation d'un paquet désinstallé. Je ne veux pas simplement une liste du contenu du rpm, par exemple

$ rpm -qpl foo.rpm

Je veux inspecter le contenu de plusieurs fichiers contenus dans le rpm. Je ne veux pas installer le rpm. Je suis également conscient de la capacité des rpms à faire des modifications supplémentaires dans les sections %post, et de la façon de les vérifier.

$ rpm -qp --scripts foo.rpm

Cependant, dans ce cas, cela ne me concerne pas.

212voto

linux_fanatic Points 4570

Avez-vous essayé le rpm2cpio commande ? Voir l'exemple ci-dessous :

$ 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

81voto

Jeff Sheffield Points 963
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

Pour référence : les arguments de cpio sont

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

J'ai trouvé la réponse ici : La réponse de lontar

36voto

Jeff Johnson Points 1777

Pour ceux qui n'ont pas rpm2cpio, voici l'ancien rpm2cpio.sh script qui extrait la charge utile d'un paquet *.rpm.

Reposé pour la postérité et la prochaine génération.

Invoquez comme ceci : ./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

30voto

rook Points 1251

Parfois, vous pouvez rencontrer un problème avec l'archive RPM intermédiaire :

cpio : Numéro malformé
cpio : Numéro malformé
cpio : Numéro malformé
. . .
cpio : fin prématurée de l'archive

Cela signifie qu'il pourrait être emballé, ces jours-ci c'est la compression LZMA2 comme d'habitude, en xz :

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

sinon vous pouvez essayer :

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

13voto

erik Points 356

La plupart des distributions ont installé l'application GUI roulette à dossier qui décompose les fichiers tar, zip, rpm et bien d'autres.

file-roller --extract-here package.rpm

Ceci va extraire le contenu dans le répertoire courant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X