web-dev-qa-db-fra.com

Comment extraire le contenu d'un rpm?

J'ai un régime et je veux le traiter comme une archive. Je veux extraire le contenu dans un répertoire afin de 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 conscient de la capacité des stratégies pour effectuer des modifications supplémentaires dans les sections% post et de la manière de les vérifier. c'est à dire.

$ rpm -qp --scripts foo.rpm

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

124
Jeff Sheffield

Avez-vous essayé la commande rpm2cpio? 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 
160
linux_fanatic
$ 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

61
Jeff Sheffield

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

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

Invoquer 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
28
Jeff Johnson

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

cpio: nombre mal formé
cpio: nombre mal formé
cpio: nombre mal formé
. . .
cpio: fin prématurée de l'archive 

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

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

sinon vous pourriez essayer:

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

La plupart des distributions ont installé l’application GUI file-roller qui décompresse tar, Zip, rpm et bien d’autres.

file-roller --extract-here package.rpm

Cela extraira le contenu du répertoire actuel.

5
erik

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

4
Davide Cesari

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

2
Melissa

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échargement: https://github.com/craigwblake/redline/releases

2
Ronan Quillevere

Dans NixOS, il existe rpmextract. C’est un wrapper autour de rpm2cpio, exactement comme @Alan Evangelista le voulait . https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract

1
user7610

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

1
Jan Hudec

Dans OpenSuse au moins, la commande unrpm est fournie avec le package build.

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

unrpm file.rpm
0
user2394284

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

0
apurbojha

Le test "DECOMPRESSION" échoue sur CygWin, l'une des plateformes les plus utiles, en raison de la vérification par "grep" de "xz" étant sensible à la casse. Le résultat du contrôle "COMPRESSION:" est:

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

Remplacer simplement "grep -q" par "grep -q -i" semble résoudre le problème.

J'ai effectué quelques mises à jour, en particulier en ajoutant des commentaires et en utilisant "case" au lieu d'instructions empilées "if", 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
0
Nico Kadel-Garcia