Answers:
您尝试过该命令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
对于那些没有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
rpm2cpio <file>.rpm | bsdtar -xf -
(没有cpio)才能工作。
gunzip
代替了xz
或lzma
工作正常。
您也可以做tar -xvf <rpm file>
!
tar
幕后使用libarchive
的系统。
bsdtar
。Mac上的Homebrew tar
默认情况下会链接到它,但在其他OS上则tar
意味着GNU tar。
强大的基于文本的文件管理器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
在CygWin(最强大的平台)上,“ DECOMPRESSION”测试失败,原因是“ xz”的“ grep”检查区分大小写。“ 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
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
7-Zip可以提取内容。它的工作方式与tar.gz文件相同。压缩文件内的压缩文件。
在安装了7-Zip的Windows 7 Pro上:
右键单击rpm文件。将鼠标悬停在上下文菜单中的7-Zip上。选择解压缩为“文件名”。
输入文件名文件夹。
右键单击cpio文件。将鼠标悬停在上下文菜单中的7-Zip上。选择解压缩为“文件名”。
大功告成 带有“文件名”的文件夹包含提取的内容以供检查。
我知道Linux的人鄙视让事情变得简单的方法,但是从长远来看,如果您不得不花时间寻找解决此类简单问题的解决方案,那么,效率低下会浪费您的钱。
考虑到您的Linux专家轻视高效的简单性,我非常怀疑Linux版本的7-Zip是否会以完全相同的方式执行相同的操作。
当您可以使彻头彻尾的笨蛋变得困难并且同时声称自己是天才时,为什么要轻松一点呢?
只是为了清楚起见;我不是Windows迷。我实际上正在考虑过渡到Linux。我只是忍不住有机会将Windows开发人员认为是常识和最佳开发人员实践的机会涂在脸上。
只是很高兴这是我发布的内容,而且您没有Mark Harmon站在您旁边。特工Leroy Jethro Gibbs会因为不使用头部而给您打耳光。
我不知道这是什么吉布斯规则,但是规则是:不要让事情变得比自己更难。
现在我们来看看谁需要休假。照顾自己!