178

我有一个 rpm,我想把它当作一个 tarball。我想将内容提取到目录中,以便检查内容。我熟悉已卸载包的查询命令。我不想简单地列出 rpm 的内容。IE

$ rpm -qpl foo.rpm

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

$ rpm -qp --scripts foo.rpm

但是在这种情况下,这与我无关。

4

15 回答 15

209

你试过这个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 
于 2013-09-13T13:27:36.313 回答
80
$ 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

于 2013-09-13T13:26:49.153 回答
34

对于那些没有 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
于 2014-09-23T04:14:46.663 回答
30

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

cpio: 格式错误的号码
cpio: 格式错误的号码
cpio: 格式错误的号码
。. .
cpio:归档提前结束

这意味着它可以被打包,现在它像往常一样是 LZMA2 压缩,通过xz

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

否则你可以尝试:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv
于 2014-09-19T12:06:11.587 回答
13

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

file-roller --extract-here package.rpm

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

于 2015-12-30T08:10:01.723 回答
6

7-zip理解大多数类型的档案,包括 rpm 和包含的 cpio。

于 2018-09-10T13:48:55.103 回答
5

你也可以简单地做tar -xvf <rpm file>

于 2015-02-10T20:14:26.147 回答
5

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

于 2016-03-16T08:38:16.090 回答
4

要调试/检查您的 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

于 2015-06-18T15:03:19.850 回答
3

在 NixOS 中,有rpmextract. 它是 rpm2cpio 的包装器,完全符合 @Alan Evangelista 的要求。 https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract

于 2016-04-13T12:59:55.757 回答
2

至少在 OpenSuse 中,该unrpm命令随build包一起提供。

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

unrpm file.rpm
于 2015-12-03T13:38:13.120 回答
1

由于“xz”的“grep”检查是区分大小写的,因此“解压缩”测试在 CygWin 上失败,CygWin 是对其最有用的平台之一。“压缩:”检查的结果是:

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

简单地将 'grep -q' 替换为 'grep -q -i' 似乎可以很好地解决问题。

我做了一些更新,特别是添加了一些注释并使用“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
于 2014-12-29T18:25:57.080 回答
1

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

于 2016-04-21T04:01:45.317 回答
0

简单地运行这个:

$rpm -ivh package_name.rpm

如果您没有超级用户权限,请使用sudo -i命令然后执行此操作。
如果您没有 rpm 包,请安装 rpm 包。

于 2022-01-02T12:24:02.023 回答
0

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

于 2021-06-17T00:59:22.710 回答