rpmの内容を抽出するにはどうすればよいですか?


154

rpmがあり、tarballのように扱いたいです。内容を検査できるように、内容をディレクトリーに抽出したい。アンインストールされたパッケージのクエリコマンドに精通しています。rpmの内容のリストだけが必要なわけではありません。すなわち

$ rpm -qpl foo.rpm

rpmに含まれるいくつかのファイルの内容を検査したいと思います。rpmをインストールしたくない。%postセクションで追加の変更を行うrpmsの機能と、それらを確認する方法も知っています。すなわち

$ rpm -qp --scripts foo.rpm

しかし、この場合、それは私には関係ありません。

回答:


184

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 

28
これは非常に一般的な操作であるため、Linuxディストリビューションでは、これを容易にするラッパー実行可能ファイル(rpmextract bla.rpmなど)が提供されていないことに驚いています。ユーザーは、中間のcpioフォーマットを気にする必要はありません。
Alan Evangelista

2
驚かないでください、@ AlanEvangelista、これはコースの標準です。
ngreen 2014年

これはrpm2cpioを:(インストールするためのrootアクセス必要
törzsmókus

9
@AlanEvangelista rpmがこのような不適切な形式であることに驚いています。UNIXの哲学に忠実に従う単純なアーカイブであるdebのような他のものと比較する。
Trismegistos

1
@SumitMurariもちろん悪い。私はtörzsmókusの苦境の解決策を提供していただけです。
MirroredFate 2017年

66
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

参考までに:cpio引数は

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

私はここで答えを見つけました:lontarの答え


1
"rpm2cpio foo.rpm | cpio -idmv"がうまくいきます。現在のパスでrpmの内容を抽出するだけで十分です。
Parasrish

32

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

Alpine Linuxを使用すると、「unlzma:bad lzma header」というエラーが表示されます。複数のrpmを試しました。
jekennedy 2018

27

中間RPMアーカイブで問題が発生することがあります。

cpio:不正な形式の番号
cpio:不正な形式の番号
cpio:不正な形式の番号
。。。
cpio:アーカイブの早期終了

それは、それがパックされる可能性があることを意味します、最近では、いつものようにLZMA2圧縮xzです:

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

そうでなければ、あなたは試すことができます:

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

2
私はこれに遭遇しました。ありがとう!
Sam Stoelinga

2
非常に便利。ありがとうございます!
ILIV

1
命の恩人。@LasseHalbergHaarbye私はそれを受け入れられた回答に追加しました。
Joseph Farah

「不正な番号」および「アーカイブの早期終了」エラーが発生しましたが、投稿された解決策のいずれも機能しませんでした。それが機能するために私はrpm2cpio <file>.rpm | bsdtar -xf -(cpioなしで)しなければなりませんでした。
jackkamm 2017

中間アーカイブは最終的にgzip形式でフォーマットされたのでgunzipxzまたはの代わりに使用して問題なく動作lzmaしました。
ジェイヘンドレン

9

ほとんどのディストリビューションには、tar、zip、rpmなどを解凍するGUIアプリfile-rollerがインストールされています

file-roller --extract-here package.rpm

これにより、現在のディレクトリの内容が抽出されます。



5

あなたも簡単に行うことができtar -xvf <rpm file>ます!


.rpmパッケージではそれを再現できません。あなたはあなたの答えを訂正したいかもしれません。
gvlasov 2015

9
これは、OS X上での作品-またはの変形使用する他のシステムtar使用するlibarchiveボンネットの下に。
Glenjamin、2015

2
エラーが発生しました:これはtarアーカイブのようには見えません。
wp-overwatch.com 2018

これは、MacOS 10.14.1とbsdtar 2.8.3-libarchive 2.8.3で動作しました。使用された圧縮のタイプによって異なる場合があります。rpm2cpio.shスクリプトは、適切なツールに渡して抽出する前に、いくつかのタイプの圧縮をチェックするようです。
2018

SOの編集機能では、答えを修正するために3文字を追加できないため、これにはlibarchiveが必要であることを追加する必要がありbsdtarます。MacのHomebrewはtarデフォルトでリンクしますが、他のOSではtarGNU tarを意味します。
Atemu

5

強力なテキストベースのファイルマネージャーmc(ミッドナイトコマンダー、ノートンコマンダーに古いDOS時代を連想させる)には、.rpmおよび.rpmsファイルを検査してアンパックする機能が組み込まれており、.rpm(s)ファイルを「開く」だけです。 mc内で以下を選択しますCONTENTS.cpio。rpmの場合はインストールツリーにアクセスでき、rpmの場合は.specファイルとすべてのソースパッケージにアクセスできます。




1

少なくともOpenSuseでは、unrpmコマンドはbuildパッケージに付属しています。

適切なディレクトリ(これはアーカイブ爆弾であるため):

unrpm file.rpm

1

.rpmファイルを別のフォルダーにコピーして、次のコマンドを実行します。$ yourfile.rpm | cpio -idmv


これはコメントでなければなりません
ケタン

1

「gzip」チェックで「xz」の大文字と小文字が区別されるため、「DECOMPRESSION」テストは、最も強力なプラットフォームの1つであるCygWinでは失敗します。「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

1

7-Zipはコンテンツを抽出できます。tar.gzファイルが機能するのと同じように機能します。圧縮ファイル内の圧縮ファイル。

7-ZipがインストールされたWindows 7 Pro:

rpmファイルを右クリックします。コンテキストメニューの7-Zipの上にマウスを置きます。「ファイル名」への抽出を選択します。

ファイル名フォルダに入力します。

cpioファイルを右クリックします。コンテキストメニューの7-Zipの上にマウスを置きます。「ファイル名」への抽出を選択します。

完了です。「filename」のフォルダには、検査用に抽出されたコンテンツが含まれています。

Linuxの人たちが物事を簡単にすることを嫌っていることは知っていますが、長い目で見れば、このような単純な問題の解決策を探すのに時間を費やす必要があるなら。その非効率はあなたにお金をかけています。

Linuxの連中が効率的な単純さを軽視しているという事実を考えると、Linuxバージョンの7-Zipがまったく同じ方法で同じことをするのではないかと私は強く疑います。

あなたがまったく愚かなことを難しくし、同時に天才であると主張できるときに、なぜそれを簡単にするのですか?

ただ明確にします; 私はWindowsのファンではありません。私は実際にLinuxへの移行を検討しています。私は、Windows開発者が常識と考えるもの、開発者のベストプラクティスをあなたの顔にこする機会に抵抗できませんでした。

私がこれを投稿してくれて、あなたの隣にマークハーモンが立っていないことをうれしく思います。特別なエージェント、リロイ・ジェスロ・ギブスは、あなたの頭を使わなかったとしてヘッドスラップを与えられたなら、そうしたでしょう。

どのギブスがそれを支配しているのか私にはわかりませんが、規則は次のとおりです。物事を必要以上に難しくしないでください。

今、私たちは休暇を取る必要がある人を見ることができます。気を付けて!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.