我有一个 rpm,我想把它当作一个 tarball。我想将内容提取到目录中,以便检查内容。我熟悉已卸载包的查询命令。我不想简单地列出 rpm 的内容。IE
$ rpm -qpl foo.rpm
我想检查 rpm 中包含的几个文件的内容。我不想安装rpm。我也知道 rpms 能够在 %post 部分进行额外的修改,以及如何检查这些。IE
$ rpm -qp --scripts foo.rpm
但是在这种情况下,这与我无关。
我有一个 rpm,我想把它当作一个 tarball。我想将内容提取到目录中,以便检查内容。我熟悉已卸载包的查询命令。我不想简单地列出 rpm 的内容。IE
$ rpm -qpl foo.rpm
我想检查 rpm 中包含的几个文件的内容。我不想安装rpm。我也知道 rpms 能够在 %post 部分进行额外的修改,以及如何检查这些。IE
$ 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's answer
对于那些没有 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
有时您会遇到中间 RPM 存档的问题:
cpio: 格式错误的号码
cpio: 格式错误的号码
cpio: 格式错误的号码
。. .
cpio:归档提前结束
这意味着它可以被打包,现在它像往常一样是 LZMA2 压缩,通过xz
:
rpm2cpio <file>.rpm | xz -d | cpio -idmv
否则你可以尝试:
rpm2cpio <file>.rpm | lzma -d | cpio -idmv
大多数发行版都安装了 GUI 应用程序文件滚轮,它可以解压 tar、zip、rpm 等等。
file-roller --extract-here package.rpm
这将提取当前目录中的内容。
7-zip理解大多数类型的档案,包括 rpm 和包含的 cpio。
你也可以简单地做tar -xvf <rpm file>
!
强大的基于文本的文件管理器mc(Midnight Commander,模糊地提醒 Norton Commander 旧 DOS 时代)具有检查和解压缩 .rpm 和 .rpms 文件的内置功能,只需“打开”.rpm(s) 文件在 mc 中并选择CONTENTS.cpio
:对于 rpm,您可以访问安装树,对于 rpm,您可以访问 .spec 文件和所有源包。
要调试/检查您的 rpm,我建议使用redline这是一个 java 程序
用法 :
java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm
在 NixOS 中,有rpmextract
. 它是 rpm2cpio 的包装器,完全符合 @Alan Evangelista 的要求。
https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract
至少在 OpenSuse 中,该unrpm
命令随build
包一起提供。
在合适的目录中(因为这是一个存档炸弹):
unrpm file.rpm
由于“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
将 .rpm 文件复制到单独的文件夹中,然后运行以下命令 $ yourfile.rpm | cpio -idmv
简单地运行这个:
$rpm -ivh package_name.rpm
如果您没有超级用户权限,请使用sudo -i
命令然后执行此操作。
如果您没有 rpm 包,请安装 rpm 包。
在使用 KDE 的 Manjaro 上,Ark 可以处理它。