我有一个rpm包,想要像对待tarball一样处理它。我希望将其内容提取到一个目录中,以便检查内容。我熟悉未安装软件包的查询命令。我不仅仅需要列出rpm包的内容。
$ rpm -qpl foo.rpm
我想检查rpm中包含的多个文件的内容。我不想安装rpm。我也知道rpm在%post部分进行其他修改的能力,以及如何检查这些修改。例如:
$ rpm -qp --scripts foo.rpm
然而在这种情况下,那对我来说并不重要。
我有一个rpm包,想要像对待tarball一样处理它。我希望将其内容提取到一个目录中,以便检查内容。我熟悉未安装软件包的查询命令。我不仅仅需要列出rpm包的内容。
$ rpm -qpl foo.rpm
我想检查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
我在这里找到了答案:lontar的回答
#!/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
rpm2cpio <file>.rpm | bsdtar -xf -
(没有cpio)才能解决问题。 - jackkammgunzip
而不是xz
或lzma
,这很好地解决了问题。 - jayhendrenzstd -d
,例如:rpm2cpio <file>.rpm | zstd -d | cpio -idmv
。 - Andrea Di Stefano大多数发行版都安装了GUI应用程序 file-roller,它可以解压tar、zip、rpm等多种格式的文件。
file-roller --extract-here package.rpm
这将提取当前目录中的内容。
tar -xvf <rpm 文件>
。libarchive
作为核心的tar
变体的系统。 - Glenjaminbsdtar
。Mac上的Homebrew默认将tar
链接到它,但在其他操作系统上,tar
表示GNU tar。 - Atemurpm2cpio foo.rpm | zstd -d | cpio -idmv
强大的基于文本的文件管理器mc(午夜指挥官,模糊地提醒着旧版DOS时代的Norton指挥官)具有内置的检查和解压.rpm和.rpms文件的功能,只需在mc中“打开”.rpm(s)文件并选择CONTENTS.cpio
:对于.rpm,您可以访问安装树,对于.rpms,您可以访问.spec文件和所有源包。
如果您需要调试/检查您的rpm包,我建议使用redline,它是一个Java程序。
用法:
java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm
rpm2cpio foo.rpm | zstd -d | cpio -idmv
- G. C.