我有一个rpm,我想把它当作一个tarball。我想把内容解压缩到一个目录中,这样我就可以检查内容了。我熟悉查询未安装软件包的命令。我并不只是想要一个rpm的内容列表。
$ rpm -qpl foo.rpm
我想检查rpm中包含的几个文件的内容。我不想安装rpm。我也知道rpms能够在%post部分做额外的修改,以及如何检查这些修改。
$ rpm -qp --scripts foo.rpm
然而在这种情况下,这对我来说并不关心。
![]() |
乐观的冰棍 · 数据指标体系搭建的7个思考点-腾讯云开发者社 ...· 1 年前 · |
![]() |
温文尔雅的紫菜汤 · MongoDB ...· 1 年前 · |
![]() |
精明的手套 · postgresql - ...· 1 年前 · |
![]() |
风流的小狗 · 数组指针和指针数组的区别 - ...· 1 年前 · |
我有一个rpm,我想把它当作一个tarball。我想把内容解压缩到一个目录中,这样我就可以检查内容了。我熟悉查询未安装软件包的命令。我并不只是想要一个rpm的内容列表。
$ rpm -qpl foo.rpm
我想检查rpm中包含的几个文件的内容。我不想安装rpm。我也知道rpms能够在%post部分做额外的修改,以及如何检查这些修改。
$ rpm -qp --scripts foo.rpm
然而在这种情况下,这对我来说并不关心。
linux
package
rpm
system-administration
Jeff Sheffield
发布于
2013-09-13
17
个回答
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格式。
ngreen
:
不要惊讶,@AlanEvangelista,这是很正常的。
@AlanEvangelista 我很惊讶,rpm是如此糟糕的格式。与其他像deb这样的文件相比,它们只是坚持UNIX理念的简单存档。
@SumitMurari 当然,这很糟糕。我只是为törzsmókus的困境提供一个解决方案。
Hi-Angel
:
在我的例子中,我用这个命令得到了
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
发布于
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
发布于
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
发布于
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 我把它添加到已接受的答案中。
jackkamm
:
我得到了 "畸形数字 "和 "存档过早结束 "的错误,但张贴的解决方案对我都不起作用。我不得不做
rpm2cpio <file>.rpm | bsdtar -xf -
(没有cpio),才得以工作。
中间归档文件对我来说是gzip格式的,所以我用了
gunzip
,而不是
xz
或
lzma
,效果不错。
对于较新的软件包(RHEL 9)使用
zstd -d
,像这样。
rpm2cpio <file>.rpm | zstd -d | cpio -idmv
。
erik
发布于
2022-06-25
0
人赞同
大多数发行版都安装了GUI应用程序
file-roller
它可以解开tar、zip、rpm和更多的东西。
file-roller --extract-here package.rpm
这将提取当前目录下的内容。
Melissa
发布于
2022-06-25
0
人赞同
你也可以简单地做
tar -xvf <rpm file>
!
gvlasov
:
无法用.rpm软件包重现这一情况。你可能想纠正你的答案。
这适用于OS X--或任何其他使用
tar
变体的系统,该变体在引擎盖下使用
libarchive
。
我得到了一个错误。这看起来不像是一个柏油档案。
2xj
:
我在MacOS 10.14.1上使用bsdtar 2.8.3 - libarchive 2.8.3时,这个方法是有效的。这可能取决于使用的是哪种压缩类型。rpm2cpio.sh脚本似乎检查了几种类型的压缩,然后将其传递给正确的工具进行提取。
Atemu
:
由于SO的编辑功能不允许我添加3个字符来修正答案,所以应该补充一下,这需要libarchive的
bsdtar
。Mac上的Homebrew默认链接了
tar
,但在其他操作系统上,
tar
意味着GNU tar。
Davide Cesari
发布于
2022-06-25
0
人赞同
强大的基于文本的文件管理器
mc
(Midnight Commander,隐约让人想起老DOS时代的Norton Commander)有检查和解压.rpm和.rpms文件的内置功能,只要在mc中 "打开".rpm(s)文件并选择
CONTENTS.cpio
:对于rpm你可以访问安装树,对于rpms你可以访问.spec文件和所有源代码包。
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
user7610
发布于
2022-06-25
0
人赞同
在NixOS中,有
rpmextract
。它是rpm2cpio的一个封装器,与@Alan Evangelista的要求完全一致。
https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract
user2394284
发布于
2022-06-25
0
人赞同
至少在OpenSuse中,
unrpm
命令是与
build
软件包一起的。
在一个合适的目录中(因为这是一个存档炸弹)。
unrpm file.rpm
apurbojha
发布于
2022-06-25
0
人赞同
将.rpm文件复制到一个单独的文件夹中,然后运行以下命令
$ yourfile.rpm | cpio -idmv
ketan
:
this should be comment
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.
发布于
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
发布于
2022-06-25
0
人赞同
simply run this:
$rpm -ivh package_name.rpm
如果你没有超级用户的权限,请使用sudo -i
命令,然后执行这个。
如果你没有rpm包,请安装rpm包。
Haizi
:
对我来说似乎不工作。我得到了以下错误:警告:rstudio-server-rhel-2021.09.2-382-x86_64.rpm:头V4 RSA/SHA256签名,密钥ID e331692f。NOKEY错误:不能在/var/lib/rpm/.rpm.lock上创建交易锁(Permission denied)
![]() |
乐观的冰棍 · 数据指标体系搭建的7个思考点-腾讯云开发者社区-腾讯云 1 年前 |