Bagaimana cara mengekstrak isi satu rpm?

154

Saya memiliki rpm dan saya ingin memperlakukannya seperti tarbal. Saya ingin mengekstraksi konten ke direktori sehingga saya dapat memeriksa isinya. Saya akrab dengan perintah kueri dari paket yang dihapus. Saya tidak hanya ingin daftar isi rpm. yaitu

$ rpm -qpl foo.rpm

Saya ingin memeriksa isi beberapa file yang terkandung dalam rpm. Saya tidak ingin menginstal rpm. Saya juga menyadari kemampuan rpms untuk melakukan modifikasi tambahan di bagian% post, dan bagaimana cara memeriksanya. yaitu

$ rpm -qp --scripts foo.rpm

Namun dalam hal ini itu bukan urusan saya.

Jeff Sheffield
sumber

Jawaban:

184

Apakah Anda mencoba perintah rpm2cpio? Lihat contoh di bawah ini:

$ 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 
linux_fanatic
sumber
28
Saya kagum bahwa distribusi Linux tidak menyediakan wrapper yang dapat dieksekusi untuk membuatnya lebih mudah (misalnya rpmextract bla.rpm), karena ini adalah operasi yang sangat umum. Pengguna tidak perlu peduli dengan format perantara cpio.
Alan Evangelista
2
Jangan kaget, @AlanEvangelista, ini setara untuk kursus.
ngreen
ini membutuhkan akses root untuk menginstal rpm2cpio :(
törzsmókus
9
@AlanEvangelista Saya heran bahwa rpm adalah format yang buruk Dibandingkan dengan deb seperti lainnya yang hanya arsip sederhana yang mengikuti filosofi UNIX.
Trismegistos
1
@ SumitMurari Tentu saja itu buruk. Saya baru saja menawarkan solusi untuk kesulitan törzsmókus.
MirroredFate
66
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

Untuk Referensi: argumen cpio adalah

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

Saya menemukan jawabannya di sini: jawaban lontar

Jeff Sheffield
sumber
1
"rpm2cpio foo.rpm | cpio -idmv" bekerja untuk saya. Cukup mengekstraksi isi rpm di jalur saat ini.
parasrish
32

Bagi mereka yang tidak memiliki rpm2cpio, ini adalah script rpm2cpio.sh kuno yang mengekstrak payload dari paket * .rpm.

Diposting ulang untuk anak cucu ... dan generasi berikutnya.

Panggil seperti ini: ./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
Jeff Johnson
sumber
Saya mendapatkan kesalahan ini "unlzma: bad lzma header" menggunakan Alpine Linux. Mencoba beberapa rpms.
jekennedy
27

Terkadang Anda dapat mengalami masalah dengan arsip RPM menengah:

cpio: Nomor cacat
cpio: Nomor cacat
cpio: Nomor cacat
. . .
cpio: akhir arsip prematur

Itu berarti bisa dikemas, hari ini kompresi LZMA2 seperti biasa, dengan xz:

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

jika tidak, Anda dapat mencoba:

rpm2cpio <file>.rpm | lzma -d | cpio -idmv
benteng
sumber
2
Saya baru saja menemukan ini. Terima kasih!
Sam Stoelinga
2
Sangat berguna. Terima kasih Pak!
ILIV
1
penyelamat. @LasseHalbergHaarbye saya menambahkannya ke jawaban yang diterima.
Joseph Farah
Saya mendapatkan kesalahan "Nomor cacat" dan "arsip prematur" tetapi tidak ada solusi yang diposting bekerja untuk saya. Saya harus melakukan rpm2cpio <file>.rpm | bsdtar -xf -(tidak cpio) agar bisa berfungsi.
jackkamm
Arsip perantara akhirnya diformat gzip untuk saya, jadi saya menggunakan gunzipalih-alih xzatau lzmayang berfungsi dengan baik.
jayhendren
9

Sebagian besar distribusi telah menginstal file-roller aplikasi GUI yang membongkar tar, zip, rpm dan banyak lagi.

file-roller --extract-here package.rpm

Ini akan mengekstraksi konten dalam direktori saat ini.

erik
sumber
6

7-zip mengerti sebagian besar jenis arsip, termasuk rpm dan cpio yang disertakan.

Jan Hudec
sumber
Saya telah mencoba dengan 7 zip dan sudah berfungsi dengan baik.
anshul
5

Anda bisa melakukannya tar -xvf <rpm file>juga!

Melissa
sumber
Tidak dapat mereproduksi itu dengan paket .rpm. Anda mungkin ingin memperbaiki jawaban Anda.
gvlasov
9
Ini berfungsi pada OS X - atau sistem lain yang menggunakan varian taryang menggunakan di libarchivebawah tenda.
Glenjamin
2
Saya mendapat kesalahan: Ini tidak terlihat seperti arsip tar.
wp-overwatch.com
Ini bekerja untuk saya di MacOS 10.14.1 dengan bsdtar 2.8.3 - libarchive 2.8.3. Itu mungkin tergantung pada jenis kompresi yang digunakan. Skrip rpm2cpio.sh tampaknya memeriksa beberapa jenis kompresi sebelum meneruskannya ke alat yang tepat untuk ekstraksi.
2xj
Karena fungsi edit SO tidak akan membiarkan saya menambahkan 3 karakter untuk memperbaiki jawaban, harus ditambahkan bahwa ini memerlukan libarchive bsdtar. Homebrew pada Mac menghubungkannya tarsecara default tetapi pada OS lain tarberarti tar GNU.
Atemu
5

Manajer file berbasis teks yang kuat mc (Midnight Commander, samar-samar mengingatkan Norton Commander dari zaman DOS lama) memiliki kemampuan built-in untuk memeriksa dan membongkar file .rpm dan .rpms, cukup "buka" file .rpm (s) dalam mc dan pilih CONTENTS.cpio: untuk rpm Anda mendapatkan akses ke pohon instalasi, untuk rpms Anda mendapatkan akses ke file .spec dan semua paket sumber.

Davide Cesari
sumber
1

Di OpenSuse setidaknya, unrpmperintahnya datang dengan buildpaket.

Dalam direktori yang sesuai (karena ini adalah bom arsip):

unrpm file.rpm
pengguna2394284
sumber
1

Salin file .rpm di folder terpisah lalu jalankan perintah berikut $ yourfile.rpm | cpio -idmv

apurbojha
sumber
ini seharusnya komentar
ketan
1

Tes "DECOMPRESSION" gagal pada CygWin, salah satu platform yang paling berguna untuk itu, karena "grep" memeriksa "xz" yang case-sensitive. Hasil cek "KOMPRESI:" adalah:

COMPRESSION='/dev/stdin: XZ compressed data'

Cukup mengganti 'grep -q' dengan 'grep -q -i' di mana-mana tampaknya menyelesaikan masalah dengan baik.

Saya telah melakukan beberapa pembaruan, terutama menambahkan beberapa komentar dan menggunakan pernyataan "case" dan bukannya stacked "if", dan menyertakan perbaikan di bawah ini

#!/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
Nico Kadel-Garcia
sumber
1

7-Zip dapat mengekstraksi konten. Ini bekerja dengan cara yang sama seperti file tar.gz bekerja. File terkompresi di dalam file terkompresi.

Di Windows 7 Pro dengan 7-Zip terpasang:

Klik kanan file rpm. Arahkan mouse ke 7-Zip di menu konteks. Pilih ekstrak ke "nama file".

Masukkan ke dalam folder nama file.

Klik kanan file cpio. Arahkan mouse ke 7-Zip di menu konteks. Pilih ekstrak ke "nama file".

Kamu selesai. Folder dengan "nama file" berisi konten yang diekstraksi untuk diperiksa.

Saya tahu Anda orang-orang Linux membenci hal-hal yang dibuat mudah, tetapi dalam jangka panjang, jika Anda harus menghabiskan waktu mencari solusi untuk masalah sederhana seperti ini; bahwa ketidakefisienan membebani Anda uang.

Mengingat fakta bahwa Anda orang-orang Linux membenci kesederhanaan yang efisien, saya sangat meragukan bahwa versi Linux 7-Zip akan melakukan hal yang sama dengan cara yang persis sama.

Mengapa membuatnya mudah ketika Anda bisa membuat orang benar-benar bodoh dan mengaku jenius pada saat yang sama?

Hanya untuk memperjelas; Saya bukan penggemar Windows. Saya sebenarnya ingin pindah ke Linux. Saya tidak bisa menolak kesempatan untuk menggosok apa yang akan dilihat pengembang Windows sebagai akal sehat, praktik pengembang terbaik di wajah Anda.

Bersyukurlah aku yang memposting ini dan Anda tidak memiliki Mark Harmon berdiri di samping Anda menyebabkan; Agen khusus Leroy Jethro Gibbs akan memberi Anda tamparan karena tidak menggunakan kepala Anda.

Saya tidak tahu Gibbs mana yang mengaturnya, tetapi aturannya adalah: Jangan membuat segalanya lebih sulit untuk diri Anda daripada yang seharusnya.

Sekarang kita bisa melihat siapa yang perlu berlibur. Hati hati!

Scott Tovey
sumber