web-dev-qa-db-ja.com

rpmの内容を抽出する方法

私はrpmを持っていて、私はそれをtarballのように扱いたいです。内容を調べられるように、内容をディレクトリに抽出したい。私は、アンインストールされたパッケージの問い合わせコマンドに精通しています。私は単純にrpmの内容のリストが欲しくない。すなわち.

$ rpm -qpl foo.rpm

Rpmに含まれるいくつかのファイルの内容を調べたいです。 私はrpmをインストールしたくありません。%postセクションで追加の変更を行うことができるrpmの機能、そしてそれらをチェックする方法も知っています。すなわち.

$ rpm -qp --scripts foo.rpm

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

131
Jeff Sheffield

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 
170
linux_fanatic
$ 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

62
Jeff Sheffield

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
30
Jeff Johnson

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

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

それはそれが詰め込まれることができることを意味します、最近ではそれはxzによっていつものようにLZMA2圧縮です:

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

それ以外の場合は試すことができます:

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

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

file-roller --extract-here package.rpm

これでカレントディレクトリの内容が抽出されます。

5
erik

強力なテキストベースのファイルマネージャmc(Midnight Commander、昔のDOS時代のNorton Commanderを漠然と思い出させる)には、.rpmファイルと.rpmsファイルを検査して解凍する機能が組み込まれています。 mc内の.rpm(s)ファイルを選択してCONTENTS.cpioを選択します。rpmの場合はインストールツリーにアクセスし、rpmの場合は.specファイルとすべてのソースパッケージにアクセスします。

4
Davide Cesari

tar -xvf <rpm file>を実行することもできます。

3
Melissa

あなたのrpmをデバッグ/検査するために私はJavaプログラムである redline を使うことを勧めます

使用法 :

Java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm

ダウンロード: https://github.com/craigwblake/redline/releases

2

7-Zip rpmや含まれているcpioなど、ほとんどの種類のアーカイブを理解できます。

2
Jan Hudec

NixOSにはrpmextractがあります。 @Alan Evangelistaが望んでいたとおり、rpm2cpioのラッパーです。 https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract

1
user7610

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

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

unrpm file.rpm
0
user2394284

.rpmファイルを別のフォルダーにコピーしてから、以下のコマンドを実行します。 cpio -idmv

0
apurbojha

"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
0