如何提取转速的内容?

我有一个转速,我想把它当作一个 tarball。我想把内容提取到一个目录中,这样我就可以检查内容。我熟悉卸载包的查询命令。我不只是想要一个列表的内容转速。也就是说。

$ rpm -qpl foo.rpm

我想检查包含在 rpm 中的几个文件的内容。我不想安装转速。我也知道转速的能力,做额外的修改在% 后段,以及如何检查这些。也就是说。

$ rpm -qp --scripts foo.rpm

然而在这种情况下,这与我无关。

245702 次浏览
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find .

参考: cpio 参数是

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

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

你试过 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

有时你可能会遇到中级 RPM 归档的问题:

畸形数字
畸形数字
畸形数字
. . .
存档的提前结束

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

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

否则你可以试试:

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

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

由于“ xz”的“ grep”检查是区分大小写的,所以“ DECOMPRESION”测试在 CygWin 上失败,CygWin 是最有潜力的平台之一。检查的结果是:

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

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

为了调试/检查您的 rpm,我建议使用 红线,这是一个 Java 程序

用法:

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

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

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

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

unrpm file.rpm

大多数发行版都安装了 GUI 应用程序 档案管理员,它可以解压 tar、 zip、 rpm 等等。

file-roller --extract-here package.rpm

这样可以提取工作目录里的东西。

强大的基于文本的文件管理器 McC(“午夜指挥官”,模糊地提醒诺顿Commander 以前的 DOS 时代)具有内置的检查和解包功能。转速和。Rpms 文件,只要“打开”。Mc 中的 rpm (s)文件,并选择 CONTENTS.cpio: 对于 rpm,您可以访问安装树,对于 rpm,您可以访问。Spec 文件和所有源代码包。

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

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

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

在 Manjaro 上使用 KDE,方舟可以处理它。

只要运行这个:

$rpm -ivh package_name.rpm

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

如果您的系统已经安装了 rpm2archive,您可以运行:

rpm2archive package.rpm

这会将 rpm 包转换成压缩的 tar 归档文件 package.rpm.tgz。现在您可以使用:

tar -xvf package.rpm.tgz

嗨,天使早些时候在他的评论中指出了这一点。

资料来源:

  1. Rpm2归档手册页
  2. 它的发布版本是 rpm 4.12.0-alpha (相当新)
  3. 关于 Debian 及其衍生产品,它包含在 rpm2cpio软件包中。

据报道: Https://bugzilla.redhat.com/show_bug.cgi?id=2058426

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

rpm2cpio foo.rpm | zstd -d | cpio -idmv