如何提取rpm的内容?

我有一个rpm,我想把它看作一个tarball。 我想提取内容到一个目录,所以我可以检查的内容。 我熟悉卸载软件包的查询命令。 我不只是想要一个rpm的内容列表。 即

$ rpm -qpl foo.rpm 

我想检查rpm中包含的几个文件的内容。 我不想安装rpm。 我也意识到在%post部分进行额外修改的转换能力,以及如何检查这些修改。 即

 $ rpm -qp --scripts foo.rpm 

但在这种情况下,我不关心。

你有没有尝试rpm2cpio ? 看下面的例子:

 $ 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 . 

参考:cpio参数是

 -i = extract -d = make directories -m = preserve modification time -v = verbose 

我在这里find答案: lontar的答案

对于那些没有rpm2cpio的人来说,这里是一个古老的rpm2cpio.sh脚本,它从* .rpm包中提取有效载荷。

为后代转发…和下​​一代。

像这样调用:./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 

有时您可能会遇到中级RPM存档的问题:

cpio:格式不正确
cpio:格式不正确
cpio:格式不正确
。 。 。
cpio:档案过早结束

这意味着它可以被打包,像往常一样这些日子它是LZMA2压缩xz

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

否则你可以尝试:

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

大多数发行版都安装了GUI应用程序文件滚轮 ,它可以解压 tar,zip,rpm等等。

 file-roller --extract-here package.rpm 

这将提取当前目录中的内容。

要debugging/检查你的rpm我build议使用红线这是一个Java程序

用法:

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

下载: https : //github.com/craigwblake/redline/releases

强大的基于文本的文件pipe理器MC (Midnight Commander,隐约提醒诺顿指挥官旧的DOS时代)内置的能力,检查和解压.rpm和.rpms文件,只是“打开”.rpm(s)文件在mc中selectCONTENTS.cpio :对于rpm,您可以访问安装树,对于rpms,您可以访问.spec文件和所有源代码包。

在NixOS中,有rpmextract 。 这是一个rpm2cpio的包装,正如@Alan Evangelista想要的一样。 https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract

您也可以简单地执行tar -xvf <rpm file>

至less在OpenSuse中, unrpm命令附带了build包。

在一个合适的目录(因为这是一个归档炸弹):

 unrpm file.rpm 

将.rpm文件复制到一个单独的文件夹中,然后运行以下命令$ yourfile.rpm | cpio -idmv

由于对“xz”区分大小写的“grep”检查,CygWin是其中一个最有用的平台,因此“DECOMPRESSION”testing失败。 “COMPRESSION:”检查的结果是:

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

简单地用'grep -q -i'代替'grep -q'似乎很好地解决了这个问题。

我已经做了一些更新,特别是添加了一些注释,并使用“case”而不是堆叠“if”语句,并在下面包含了该修复

 #!/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