如何提取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