相关文章推荐
英姿勃勃的黄豆  ·  python + ...·  11 月前    · 
爱逃课的剪刀  ·  torch.load 报错 ...·  11 月前    · 

我如何提取一个rpm的内容?

187 人关注

我有一个rpm,我想把它当作一个tarball。我想把内容解压缩到一个目录中,这样我就可以检查内容了。我熟悉查询未安装软件包的命令。我并不只是想要一个rpm的内容列表。

$ rpm -qpl foo.rpm

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

$ rpm -qp --scripts foo.rpm

然而在这种情况下,这对我来说并不关心。

linux
package
rpm
system-administration
Jeff Sheffield
Jeff Sheffield
发布于 2013-09-13
17 个回答
linux_fanatic
linux_fanatic
发布于 2022-06-25
已采纳
0 人赞同

你试过 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  
    
我很惊讶,Linux发行版没有提供一个包装可执行程序来使之更容易(例如rpmextract bla.rpm),因为这是一个非常常见的操作。用户应该不需要关心中间的cpio格式。
不要惊讶,@AlanEvangelista,这是很正常的。
@AlanEvangelista 我很惊讶,rpm是如此糟糕的格式。与其他像deb这样的文件相比,它们只是坚持UNIX理念的简单存档。
@SumitMurari 当然,这很糟糕。我只是为törzsmókus的困境提供一个解决方案。
在我的例子中,我用这个命令得到了 cpio: Malformed number 的错误。对我有用的是运行 rpm2archive xorg-x11-server-1.20.11-1.fc33.src.rpm ,然后 tar -xzvf xorg-x11-server-1.20.11-1.fc33.src.rpm.tgz 来提取到当前目录。
Jeff Sheffield
Jeff Sheffield
发布于 2022-06-25
0 人赞同
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

供参考:cpio的参数是

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

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

"rpm2cpio foo.rpm | cpio -idmv "对我有用。它足以提取当前路径下的rpm内容。
Jeff Johnson
Jeff Johnson
发布于 2022-06-25
0 人赞同

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

转贴给后人......和下一代人。

Invoke like this: ./rpm2cpio.sh .rpm | cpio -dimv

#!/bin/sh
pkg=$1
if [ "$pkg" = "" -o ! -e "$pkg" ]; then
    echo "no package supplied" 1>&2
    exit 1
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
        # 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 ;;
$EXTRACTOR 2>/dev/null | $DECOMPRESSOR
    
我使用Alpine Linux得到这个错误 "unlzma: bad lzma header"。我试过多个转速。
rook
rook
发布于 2022-06-25
0 人赞同

有时你会遇到中间RPM存档的问题。

cpio。畸形的数字
cpio。畸形的数字
cpio。畸形的数字
. . .
cpio:存档过早结束

这意味着它可以被打包,这几天照例是LZMA2压缩,由 xz

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

otherwise you could try:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv
    
ILIV
非常有用。谢谢你,先生!
救世主。@LasseHalbergHaarbye 我把它添加到已接受的答案中。
我得到了 "畸形数字 "和 "存档过早结束 "的错误,但张贴的解决方案对我都不起作用。我不得不做 rpm2cpio <file>.rpm | bsdtar -xf - (没有cpio),才得以工作。
中间归档文件对我来说是gzip格式的,所以我用了 gunzip ,而不是 xz lzma ,效果不错。
对于较新的软件包(RHEL 9)使用 zstd -d ,像这样。 rpm2cpio <file>.rpm | zstd -d | cpio -idmv
erik
erik
发布于 2022-06-25
0 人赞同

大多数发行版都安装了GUI应用程序 file-roller 它可以解开tar、zip、rpm和更多的东西。

file-roller --extract-here package.rpm

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

Jan Hudec
Jan Hudec
发布于 2022-06-25
0 人赞同

7-zip 了解大多数种类的档案,包括rpm和附带的cpio。

我试着用7个压缩包,它已经完全工作了。
Melissa
Melissa
发布于 2022-06-25
0 人赞同

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

无法用.rpm软件包重现这一情况。你可能想纠正你的答案。
这适用于OS X--或任何其他使用 tar 变体的系统,该变体在引擎盖下使用 libarchive
我得到了一个错误。这看起来不像是一个柏油档案。
2xj
我在MacOS 10.14.1上使用bsdtar 2.8.3 - libarchive 2.8.3时,这个方法是有效的。这可能取决于使用的是哪种压缩类型。rpm2cpio.sh脚本似乎检查了几种类型的压缩,然后将其传递给正确的工具进行提取。
由于SO的编辑功能不允许我添加3个字符来修正答案,所以应该补充一下,这需要libarchive的 bsdtar 。Mac上的Homebrew默认链接了 tar ,但在其他操作系统上, tar 意味着GNU tar。
Davide Cesari
Davide Cesari
发布于 2022-06-25
0 人赞同

强大的基于文本的文件管理器 mc (Midnight Commander,隐约让人想起老DOS时代的Norton Commander)有检查和解压.rpm和.rpms文件的内置功能,只要在mc中 "打开".rpm(s)文件并选择 CONTENTS.cpio :对于rpm你可以访问安装树,对于rpms你可以访问.spec文件和所有源代码包。

Ronan Quillevere
Ronan Quillevere
发布于 2022-06-25
0 人赞同

To debug / inspect your rpm I suggest to use redline 这是个java程序

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

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

user7610
user7610
发布于 2022-06-25
0 人赞同

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

user2394284
user2394284
发布于 2022-06-25
0 人赞同

至少在OpenSuse中, unrpm 命令是与 build 软件包一起的。

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

unrpm file.rpm
    
apurbojha
apurbojha
发布于 2022-06-25
0 人赞同

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

this should be comment
JasonPlutext
JasonPlutext
发布于 2022-06-25
0 人赞同

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

Nico Kadel-Garcia
Nico Kadel-Garcia
发布于 2022-06-25
0 人赞同

由于 "grep "对 "xz "的检查是区分大小写的,所以 "deCOMPRESSION "测试在CygWin上失败了,CygWin是对它最有用的平台之一。COMPRESSION: "检查的结果是。

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
rpm="$1"
if [ -e "$rpm" ]; then
    echo "Error: missing $rpm"
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
$EXTRACTOR 2>/dev/null | $DECOMPRESSOR
    
G. C.
G. C.
发布于 2022-06-25
0 人赞同

正如这里所报道的。 https://bugzilla.redhat.com/show_bug.cgi?id=2058426

RHEL 9使用一个有效载荷压缩(zstd)。

rpm2cpio foo.rpm | zstd -d | cpio -idmv
    
Ayub Shaik
Ayub Shaik
发布于 2022-06-25
0 人赞同

simply run this:

$rpm -ivh package_name.rpm

如果你没有超级用户的权限,请使用sudo -i命令,然后执行这个。
如果你没有rpm包,请安装rpm包。

对我来说似乎不工作。我得到了以下错误:警告:rstudio-server-rhel-2021.09.2-382-x86_64.rpm:头V4 RSA/SHA256签名,密钥ID e331692f。NOKEY错误:不能在/var/lib/rpm/.rpm.lock上创建交易锁(Permission denied)
TBourne
TBourne
发布于 2022-06-25
0 人赞同

如果你的系统安装了 rpm2archive ,你可以运行。

rpm2archive package.rpm

这将rpm包转换为压缩的tar档案package.rpm.tgz。现在你可以用以下方法解压它

tar -xvf package.rpm.tgz

这一点早先由欣欣 in his comment.

Sources: