如何提取rpm的内容?

Jef*_*eld 135 linux system-administration rpm package

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

$ rpm -qpl foo.rpm
Run Code Online (Sandbox Code Playgroud)

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

$ rpm -qp --scripts foo.rpm
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我并不担心.

小智 171

你试过这个命令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 
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶Linux发行版没有提供一个包装器可执行文件来使这更容易(例如rpmextract bla.rpm),因为这是一个非常常见的操作.用户不应该关心中间的cpio格式. (22认同)
  • @AlanEvangelista我很惊讶rpm是如此糟糕的格式.与其他像deb一样,只是简单的档案,坚持UNIX哲学. (9认同)
  • 就我而言,我使用此命令收到“cpio:格式错误的数字”错误。对我有用的是运行“rpm2archive xorg-x11-server-1.20.11-1.fc33.src.rpm”,然后运行“tar -xzvf xorg-x11-server-1.20.11-1.fc33.src.rpm” .tgz` 提取到当前目录。 (8认同)
  • @Hi-Angel这是因为RHEL 9使用了有效负载压缩(zstd),我添加了一个答案,这是另一种提取它的方法:`rpm2cpio foo.rpm | zstd-d| cpio -idmv` (5认同)
  • 不要惊讶,@AlanEvangelista,这是课程的标准。 (2认同)

Jef*_*eld 63

$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 
Run Code Online (Sandbox Code Playgroud)

供参考:cpio参数是

-i = extract
-d = make directories
-m = preserve modification time
-v = verbose
Run Code Online (Sandbox Code Playgroud)

我在这里找到了答案:lontar的回答

  • “rpm2cpio foo.rpm | cpio -idmv”对我有用。在当前路径提取 rpm 的内容就足够了。 (2认同)

小智 30

对于那些没有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
Run Code Online (Sandbox Code Playgroud)


roo*_*ook 24

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

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

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

rpm2cpio <file>.rpm | xz -d | cpio -idmv
Run Code Online (Sandbox Code Playgroud)

否则你可以尝试:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚遇到这个.谢谢! (2认同)
  • 很有用.谢谢你,先生! (2认同)
  • 这应包含在已接受的答案中 (2认同)
  • 对于较新的软件包 (RHEL 9),请使用 `zstd -d`,如下所示: `rpm2cpio &lt;file&gt;.rpm | zstd-d| cpio -idmv` (2认同)

eri*_*rik 6

大多数发行版都安装了GUI app file-roller,它可以解压缩tar,zip,rpm等等.

file-roller --extract-here package.rpm
Run Code Online (Sandbox Code Playgroud)

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


Jan*_*dec 6

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


G. *_* C. 6

正如此处报道的: https ://bugzilla.redhat.com/show_bug.cgi?id=2058426

RHEL 9 使用有效负载压缩 (zstd)

rpm2cpio foo.rpm | zstd -d | cpio -idmv
Run Code Online (Sandbox Code Playgroud)


小智 5

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

  • 这适用于 OS X - 或任何其他使用 `tar` 变体的系统,该变体在引擎盖下使用 `libarchive`。 (10认同)
  • 我收到错误:这看起来不像 tar 档案。 (3认同)

小智 5

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