Comment extraire le contenu d'un rpm?

154

J'ai un rpm et je veux le traiter comme une archive tar. Je veux extraire le contenu dans un répertoire pour pouvoir inspecter le contenu. Je connais les commandes d'interrogation d'un package désinstallé. Je ne veux pas simplement une liste du contenu du rpm. c'est à dire

$ 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é de rpms à faire des modifications supplémentaires dans les sections% post, et comment les vérifier. c'est à dire

$ rpm -qp --scripts foo.rpm

Cependant, dans ce cas, cela ne me préoccupe pas.

Jeff Sheffield
la source

Réponses:

184

Avez-vous essayé la rpm2cpiocommande? 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 
linux_fanatic
la source
28
Je suis étonné que les distributions Linux ne fournissent pas d'exécutable wrapper pour rendre cela plus facile (par exemple rpmextract bla.rpm), car c'est une opération très courante. L'utilisateur ne devrait pas avoir à se soucier du format cpio intermédiaire.
Alan Evangelista
2
Ne soyez pas surpris, @AlanEvangelista, c'est normal pour le cours.
ngreen
cela nécessite un accès root pour installer rpm2cpio :(
törzsmókus
9
@AlanEvangelista Je suis étonné que rpm soit un si mauvais format. Comparé à d'autres comme deb qui ne sont que de simples archives adhérant à la philosophie UNIX.
Trismegistos
1
@SumitMurari Bien sûr, c'est mauvais. J'offrais juste une solution à la situation difficile de törzsmókus.
MirroredFate
66
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

Pour référence: les arguments 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

Jeff Sheffield
la source
1
"rpm2cpio foo.rpm | cpio -idmv" fonctionne pour moi. Il suffit d'extraire le contenu du rpm au chemin courant.
parasrish
32

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

Republié pour la postérité… et la prochaine génération.

Appelez 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
Jeff Johnson
la source
J'obtiens cette erreur "unlzma: bad lzma header" en utilisant Alpine Linux. J'ai essayé plusieurs rpms.
jekennedy
27

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

cpio: numéro mal formé
cpio: numéro malformé
cpio: numéro mal formé
. . .
cpio: fin prématurée de l'archive

Cela signifie qu'il pourrait être emballé, ces jours-ci, il s'agit de la compression LZMA2 comme d'habitude, par xz:

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

sinon vous pouvez essayer:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv
tour
la source
2
je viens de rencontrer ça. Merci!
Sam Stoelinga
2
Très utile. Merci Monsieur!
ILIV
1
bouée de sauvetage. @LasseHalbergHaarbye je l'ai ajouté à la réponse acceptée.
Joseph Farah
J'obtenais les erreurs «Nombre mal formé» et «Fin prématurée de l'archive», mais aucune des solutions affichées n'a fonctionné pour moi. Je devais faire rpm2cpio <file>.rpm | bsdtar -xf -(pas de cpio) pour que ça marche.
jackkamm
L'archive intermédiaire a fini par être au format gzip pour moi, donc j'ai utilisé à la gunzipplace xzou lzmaqui a bien fonctionné.
jayhendren
9

La plupart des distributions ont installé le file-roller de l' application GUI qui décompresse tar, zip, rpm et bien d'autres.

file-roller --extract-here package.rpm

Cela extraira le contenu du répertoire actuel.

erik
la source
6

7-zip comprend la plupart des types d'archives, y compris rpm et le cpio inclus.

Jan Hudec
la source
J'ai essayé avec 7 zip et cela a parfaitement fonctionné.
anshul
5

Vous pouvez tout simplement faire tar -xvf <rpm file>aussi bien!

Mélisse
la source
Impossible de reproduire cela avec un package .rpm. Vous voudrez peut-être corriger votre réponse.
gvlasov
9
Cela fonctionne sur OS X - ou tout autre système qui utilise une variante tarqui utilise libarchivesous le capot.
Glenjamin
2
J'ai eu l'erreur: cela ne ressemble pas à une archive tar.
wp-overwatch.com
Cela a fonctionné pour moi sur MacOS 10.14.1 avec bsdtar 2.8.3 - libarchive 2.8.3. Cela peut dépendre du type de compression utilisé. Le script rpm2cpio.sh semble vérifier plusieurs types de compression avant de le passer au bon outil pour l'extraction.
2xj
Puisque la fonctionnalité d'édition de SO ne me laisse pas ajouter 3 caractères pour corriger la réponse, il faut ajouter que cela nécessite libarchive bsdtar. Homebrew sur Mac y est lié tarpar défaut, mais sur d'autres OS tarsignifie GNU tar.
Atemu le
5

Le puissant gestionnaire de fichiers texte mc (Midnight Commander, rappelant vaguement à Norton Commander l'ancien temps DOS) a la capacité intégrée d'inspecter et de décompresser les fichiers .rpm et .rpms, il suffit d '«ouvrir» le fichier .rpm (s) dans mc et sélectionnez CONTENTS.cpio: pour un rpm vous avez accès à l'arborescence d'installation, pour un rpms vous avez accès au fichier .spec et à tous les paquets sources.

Davide Cesari
la source
1

Dans OpenSuse au moins, la unrpmcommande est fournie avec le buildpackage.

Dans un répertoire approprié (car il s'agit d'une bombe d'archive):

unrpm file.rpm
user2394284
la source
1

Copiez le fichier .rpm dans un dossier séparé, puis exécutez la commande suivante $ yourfile.rpm | cpio -idmv

Apurbojha
la source
cela devrait être un commentaire
ketan
1

Le test "DECOMPRESSION" échoue sur CygWin, une des plates-formes les plus puissamment utiles, car le contrôle "grep" pour "xz" est sensible à la casse. Le résultat du contrôle "COMPRESSION:" est:

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

Le simple remplacement de «grep -q» par «grep -q -i» partout semble bien résoudre le problème.

J'ai fait quelques mises à jour, en particulier en ajoutant des commentaires et en utilisant "case" au lieu d'instructions "if" empilées, et j'ai inclus ce correctif ci-dessous

#!/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
la source
1

7-Zip est capable d'extraire le contenu. Cela fonctionne de la même manière qu'un fichier tar.gz fonctionne. Un fichier compressé dans un fichier compressé.

Sur Windows 7 Pro avec 7-Zip installé:

Cliquez avec le bouton droit sur le fichier rpm. Passez la souris sur 7-Zip dans le menu contextuel. Sélectionnez extraire "nom de fichier".

Entrez dans le dossier des noms de fichiers.

Cliquez avec le bouton droit sur le fichier cpio. Passez la souris sur 7-Zip dans le menu contextuel. Sélectionnez extraire "nom de fichier".

Vous avez terminé. Le dossier avec "filename" contient le contenu extrait pour l'inspection.

Je sais que vous les gars de Linux méprisez que les choses soient faciles, mais à long terme, si vous devez passer du temps à chercher une solution à un problème simple comme celui-ci; cette inefficacité vous coûte de l'argent.

Étant donné que vous, Linux, vous méprisez la simplicité efficace, je doute fortement que la version Linux de 7-Zip fasse exactement la même chose de la même manière.

Pourquoi rendre les choses faciles quand on peut rendre carrément stupide difficile et prétendre être un génie en même temps?

Juste pour être clair; Je ne suis pas fan de Windows. Je cherche en fait à passer à Linux. Je n'ai tout simplement pas pu résister à l'opportunité de frotter ce que les développeurs Windows considéreraient comme du bon sens, les meilleures pratiques de développement dans vos visages.

Sois juste content que ce soit moi qui poste ça et que tu n'as pas Mark Harmon debout à côté de toi parce que; L'agent spécial Leroy Jethro Gibbs vous aurait donné une gifle pour ne pas avoir utilisé votre tête.

Je ne sais pas de quelle règle Gibbs il s'agit, mais la règle est la suivante: ne vous rendez pas les choses plus difficiles qu'elles ne devraient l'être.

Maintenant, nous voyons qui doit prendre des vacances. Prends soin de toi!

Scott Tovey
la source