Comment puis-je extraire le contenu d'un rpm?

j'ai un rpm et je veux le traiter comme une boule de goudron. Je veux extraire le contenu dans un répertoire pour pouvoir inspecter le contenu. Je suis familier avec les commandes d'interrogation d'un paquet 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 au courant de la capacité du GPR 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 concerne pas.

117
demandé sur Jeff Sheffield 2013-09-13 17:19:29

13 réponses

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 
152
répondu linux_fanatic 2014-12-22 12:04:07
$ 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

58
répondu Jeff Sheffield 2017-05-23 12:03:02

pour ceux qui n'ont pas rpm2cpio, voici l'ancienne rpm2cpio.sh scénario que des extraits de la charge utile à partir d'un *.package rpm.

pour la postérité ... et la génération suivante.

invoquez comme ceci: ./rpm2cpio.sh .rpm / cpio-dimv

#!/bin/sh

pkg=
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 \*  +  \) +  \) + `
dl=`expr 256 \* \( 256 \* \( 256 \*  +  \) +  \) + `
# 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 \*  +  \) +  \) + `
dl=`expr 256 \* \( 256 \* \( 256 \*  +  \) +  \) + `
# 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
27
répondu Jeff Johnson 2017-06-13 02:28:25

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

cpio: numéro malformé

cpio: numéro malformé

cpio: numéro malformé

. . .

cpio: fin prématurée des archives

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

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

sinon vous pourriez essayer:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv
18
répondu rook 2014-09-19 12:06:11

la plupart des distributions ont installé le GUI app file-roller qui déballe tar, zip, rpm et beaucoup plus.

file-roller --extract-here package.rpm

ceci extraira le contenu dans le répertoire courant.

5
répondu erik 2015-12-30 08:10:01

Le texte puissant gestionnaire de fichiers basé sur mc (Midnight commander, rappelant vaguement le Norton Commandant de la vieille époque DOS) a la capacité intégrée de l'inspection et déballage .tr / min et .rpm fichiers, juste de "l'ouvrir".rpm (s) fichier au sein de mc et sélectionnez CONTENTS.cpio : pour un rpm, vous accédez à l'arbre d'installation, pour un rpms vous accédez à la .fichier spec et tous les paquets source.

3
répondu Davide Cesari 2016-03-16 08:38:16

pour déboguer / inspecter votre rpm je suggère d'utiliser redline qui est un programme java

Utilisation :

java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm

télécharger: https://github.com/craigwblake/redline/releases

2
répondu Ronan Quillevere 2015-06-18 15:03:19

, Vous pouvez simplement faire tar -xvf <rpm file> ainsi!

1
répondu Melissa 2015-02-11 18:18:44

à NixOS, il y a rpmextract . C'est une couverture autour de rpm2cpio, exactement comme @Alan Evangelista le voulait. https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract

1
répondu user7610 2016-04-13 12:59:55

en OpenSuse au moins, la commande unrpm est livrée avec le paquet build .

dans un répertoire approprié (parce qu'il s'agit d'une bombe d'archives):

unrpm file.rpm
0
répondu user2394284 2015-12-03 13:38:13

bien reçu .rpm file dans un dossier séparé puis lancez la commande suivante $ monfichier.rpm / cpio-idmv

0
répondu apurbojha 2016-04-21 04:01:45

le test de "décompression" échoue sur CygWin, l'une des plates-formes les plus potentiellement utiles pour elle, en raison du contrôle "grep" pour " xz " étant sensible à la casse. Le résultat de la "COMPRESSION:" contrôle est:

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

le simple fait de remplacer "grep-q" par "grep-q-i" semble partout résoudre le problème.

j'ai fait quelques mises à jour, en particulier en ajoutant quelques commentaires et en utilisant "case" au lieu de stacked "si" déclarations, et inclus que fixer en dessous de

#!/bin/sh
#
# rpm2cpio.sh - extract 'cpio' contents of RPM
#
# Typical usage: rpm2cpio.sh rpmname | cpio -idmv
#

if [ "$# -ne 1" ]; then
    echo "Usage: "151910920" file.rpm" 1>&2
    exit 1
fi

rpm=""
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 \*  +  \) +  \) + `
dl=`expr 256 \* \( 256 \* \( 256 \*  +  \) +  \) + `
# 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 \*  +  \) +  \) + `
dl=`expr 256 \* \( 256 \* \( 256 \*  +  \) +  \) + `
# 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
0
répondu Nico Kadel-Garcia 2017-08-21 02:52:43

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

0
répondu Jan Hudec 2018-09-10 13:48:55