linux - descomprimir - ¿Cómo extraigo el contenido de un rpm?
descomprimir rpm centos 7 (12)
¡También puede hacer tar -xvf <rpm file>
también!
Tengo un rpm y quiero tratarlo como un tarball. Quiero extraer los contenidos en un directorio para poder inspeccionar los contenidos. Estoy familiarizado con los comandos de consulta de un paquete desinstalado. No quiero simplemente una lista de los contenidos de las rpm. es decir
$ rpm -qpl foo.rpm
Quiero inspeccionar el contenido de varios archivos contenidos en las rpm. No quiero instalar las rpm. También estoy al tanto de la capacidad de rpms para hacer modificaciones adicionales en las secciones de% post, y cómo verificarlas. es decir
$ rpm -qp --scripts foo.rpm
Sin embargo, en este caso, eso no me concierne.
¿Has rpm2cpio
el rpm2cpio
rpm2cpio? Vea el ejemplo a continuación:
$ 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
A veces puede encontrar un problema con el archivo RPM intermedio:
cpio: número mal formado
cpio: número mal formado
cpio: número mal formado
. . .
cpio: final prematuro del archivo
Eso significa que podría estar empaquetado, en estos días es la compresión LZMA2 como de costumbre, por xz
:
rpm2cpio <file>.rpm | xz -d | cpio -idmv
de lo contrario, podrías intentarlo:
rpm2cpio <file>.rpm | lzma -d | cpio -idmv
Copie el archivo .rpm en una carpeta separada y luego ejecute el siguiente comando $ yourfile.rpm | cpio -idmv
El poderoso administrador de archivos basado en texto mc (Midnight Commander, recordando vagamente al Norton Commander de los viejos tiempos de DOS) tiene la capacidad incorporada de inspeccionar y desempacar archivos .rpm y .rpms, simplemente "abre" el archivo .rpm (s) dentro de mc y seleccione CONTENTS.cpio
: para un rpm, obtiene acceso al árbol de instalación, para un rpms, obtiene acceso al archivo .spec y a todos los paquetes fuente.
En NixOS, hay rpmextract
. Es un envoltorio alrededor de rpm2cpio, exactamente como quería @Alan Evangelista. https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract
En OpenSuse al menos, el comando unrpm
viene con el paquete de build
.
En un directorio adecuado (porque esta es una bomba de archivo):
unrpm file.rpm
La mayoría de las distribuciones han instalado el rodillo de archivos de la aplicación GUI que descomprime tar, zip, rpm y muchos más.
file-roller --extract-here package.rpm
Esto extraerá los contenidos en el directorio actual.
La prueba "DECOMPRESSION" falla en CygWin, una de las plataformas potencialmente más potentes para ella, debido a la comprobación "grep" de "xz" que distingue entre mayúsculas y minúsculas. El resultado de la comprobación de "COMPRESIÓN:" es:
COMPRESSION=''/dev/stdin: XZ compressed data''
Simplemente reemplazar ''grep -q'' con ''grep -q -i'' en todas partes parece resolver bien el problema.
He hecho algunas actualizaciones, particularmente agregando algunos comentarios y usando "caso" en lugar de declaraciones "si" apiladas, e incluí esa corrección a continuación
#!/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
Para aquellos que no tienen rpm2cpio, aquí está el antiguo script rpm2cpio.sh que extrae la carga de un paquete * .rpm.
Repostado para la posteridad ... y la próxima generación.
Invoque de esta manera: ./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
Para depurar / inspeccionar sus rpm, le sugiero que use redline que es un programa de Java
Uso:
java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find .
Para referencia: los argumentos cpio son
-i = extract
-d = make directories
-m = preserve modification time
-v = verbose
Encontré la respuesta aquí: la respuesta de lontar