如何提取rpm的内容?

时间:2013-09-13 13:19:29

标签: linux package rpm system-administration

我有一个转速,我想把它当成一个tarball。我想将内容提取到一个目录中,以便我可以检查内容。我熟悉已卸载软件包的查询命令。我不只是想要一个rpm的内容列表。即。

$ rpm -qpl foo.rpm

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

$ rpm -qp --scripts foo.rpm

然而在这种情况下我并不担心。

15 个答案:

答案 0 :(得分:166)

您是否尝试过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 

答案 1 :(得分:62)

$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

供参考:cpio参数是

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

我在这里找到答案:lontar's answer

答案 2 :(得分:29)

对于那些没有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

答案 3 :(得分:21)

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

  

cpio:格式错误的数字
  cpio:格式错误的数字
  cpio:格式错误的数字
     。 。 。
  cpio:存档过早结束

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

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

否则你可以尝试:

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

答案 4 :(得分:5)

大多数发行版都安装了GUI应用 file-roller ,它解压缩了tar,zip,rpm等等。

file-roller --extract-here package.rpm

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

答案 5 :(得分:4)

强大的基于文本的文件管理器 mc (Midnight Commander,模糊地提醒旧DOS时代的Norton Commander)具有检查和解压缩.rpm和.rpms文件的内置功能,在mc中“打开”.rpm文件并选择CONTENTS.cpio:对于rpm,您可以访问安装树,对于rpm,您可以访问.spec文件和所有源包。

答案 6 :(得分:3)

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

答案 7 :(得分:2)

要调试/检查你的rpm我建议使用redline这是一个java程序

用法:

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

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

答案 8 :(得分:2)

7-zip了解大多数存档,包括rpm和随附的cpio。

答案 9 :(得分:1)

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

答案 10 :(得分:1)

7-Zip可以提取内容。 它的工作方式与tar.gz文件相同。 压缩文件中的压缩文件。

在安装了7-Zip的Windows 7 Pro上:

右键单击rpm文件。 将鼠标悬停在上下文菜单中的7-Zip上。 选择解压缩到“文件名”。

进入文件名文件夹。

右键单击cpio文件。 将鼠标悬停在上下文菜单中的7-Zip上。 选择解压缩到“文件名”。

您完成了。 带有“文件名”的文件夹包含提取的内容以供检查。

我知道您Linux的人鄙视让事情变得简单的方法,但是从长远来看,如果您必须花时间寻找解决此类简单问题的解决方案,那么,效率低下会浪费您的钱。

鉴于您的Linux专家们鄙视高效的简单性,我非常怀疑Linux版本的7-Zip是否会以完全相同的方式完成相同的工作。

为什么当让彻头彻尾的笨蛋变得笨拙并声称自己是天才的时候变得如此容易?

只是要清楚一点;我不是Windows迷。我实际上正在考虑过渡到Linux。我只是忍不住有机会将Windows开发人员认为是常识和最佳开发人员实践的机会涂在脸上。

很高兴是我发布了此消息,而您没有让Mark Harmon站在您旁边。特工Leroy Jethro Gibbs会因为不使用头部而给您打耳光。

我不知道这是哪个吉布斯规则,但规则是: 不要让事情变得比自己更难。

现在,我们来看看谁需要休假。 保重!

答案 11 :(得分:0)

“DECOMPRESSION”测试在CygWin上失败,CygWin是最有潜力的平台之一,因为“grep”检查“xz”区分大小写。 “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

答案 12 :(得分:0)

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

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

unrpm file.rpm

答案 13 :(得分:0)

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

答案 14 :(得分:0)

在使用 KDE 的 Manjaro 上,Ark 可以处理它。