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.
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
$ 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
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
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
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.
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.
Vous pouvez aussi simplement faire tar -xvf <rpm file>
!
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
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
7-Zip comprend la plupart des types d'archives, y compris rpm et le cpio inclus.
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
Copiez le fichier .rpm dans un dossier séparé, puis exécutez la commande suivante $ Yourfile.rpm | cpio -idmv
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