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.
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
$ 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
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
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
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.
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.
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
à 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
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
bien reçu .rpm file dans un dossier séparé puis lancez la commande suivante $ monfichier.rpm / cpio-idmv
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