私はrpmを持っていて、私はそれをtarballのように扱いたいです。内容を調べられるように、内容をディレクトリに抽出したい。私は、アンインストールされたパッケージの問い合わせコマンドに精通しています。私は単純にrpmの内容のリストが欲しくない。すなわち.
$ rpm -qpl foo.rpm
Rpmに含まれるいくつかのファイルの内容を調べたいです。 私はrpmをインストールしたくありません。%postセクションで追加の変更を行うことができるrpmの機能、そしてそれらをチェックする方法も知っています。すなわち.
$ 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を持っていない人のために、これは* .rpmパッケージからペイロードを抽出する古代のrpm2cpio.shスクリプトです。
後世のために再投稿された…そして次世代。
次のように起動します。/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:アーカイブの早期終了
それはそれが詰め込まれることができることを意味します、最近ではそれはxz
によっていつものようにLZMA2圧縮です:
rpm2cpio <file>.rpm | xz -d | cpio -idmv
それ以外の場合は試すことができます:
rpm2cpio <file>.rpm | lzma -d | cpio -idmv
ほとんどのディストリビューションはGUIアプリfile-rollerをインストールしています。これはtar、Zip、rpmなどを解凍します。
file-roller --extract-here package.rpm
これでカレントディレクトリの内容が抽出されます。
強力なテキストベースのファイルマネージャmc(Midnight Commander、昔のDOS時代のNorton Commanderを漠然と思い出させる)には、.rpmファイルと.rpmsファイルを検査して解凍する機能が組み込まれています。 mc内の.rpm(s)ファイルを選択してCONTENTS.cpio
を選択します。rpmの場合はインストールツリーにアクセスし、rpmの場合は.specファイルとすべてのソースパッケージにアクセスします。
tar -xvf <rpm file>
を実行することもできます。
あなたのrpmをデバッグ/検査するために私はJavaプログラムである redline を使うことを勧めます
使用法 :
Java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm
7-Zip rpmや含まれているcpioなど、ほとんどの種類のアーカイブを理解できます。
NixOSにはrpmextract
があります。 @Alan Evangelistaが望んでいたとおり、rpm2cpioのラッパーです。 https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract
OpenSuseでは、少なくともunrpm
コマンドにbuild
パッケージが付属しています。
適切なディレクトリ(これはアーカイブ爆弾なので):
unrpm file.rpm
.rpmファイルを別のフォルダーにコピーしてから、以下のコマンドを実行します。 cpio -idmv
"DECOMPRESSION"テストはCygWinで失敗します。CygWinは "xz"の "grep"チェックで大文字と小文字が区別されるためです。 "COMPRESSION:"チェックの結果は次のとおりです。
COMPRESSION='/dev/stdin: XZ compressed data'
至る所で単に 'grep -q'を 'grep -q -i'に置き換えるだけで問題は解決されると思われます。
私はいくつかの更新をしました、特にいくつかのコメントを加えて、積み重ねられた「if」ステートメントの代わりに「case」を使用して、そしてその修正を下記に含みます
#!/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