Bir rpm içeriğini nasıl ayıklayabilirim?


154

Bir rpm var ve bir tarball gibi davranmak istiyorum. İçeriği inceleyebilmek için içeriği bir dizine çıkarmak istiyorum. Kaldırılmış bir paketin sorgulama komutlarına aşinayım. Sadece rpm içeriğinin bir listesini istemiyorum. yani

$ rpm -qpl foo.rpm

Rpm'de bulunan birkaç dosyanın içeriğini incelemek istiyorum. RPM kurmak istemiyorum. Ayrıca rpms% sonrası bölümlerinde ek değişiklikler yapma yeteneğinin ve bunların nasıl kontrol edileceğinin farkındayım. yani

$ rpm -qp --scripts foo.rpm

Ancak bu durumda bu beni ilgilendirmiyor.

Yanıtlar:


184

Denediniz mi rpm2cpioCommmand? Aşağıdaki örneğe bakın:

$ 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 dağıtımlarının bunu kolaylaştırmak için yürütülebilir bir sarıcı (örneğin rpmextract bla.rpm) sağlamadığına şaşırıyorum, çünkü bu çok yaygın bir işlemdir. Kullanıcının aracı cpio formatı ile ilgilenmesi gerekmez.
Alan Evangelista

2
Şaşırmayın, @AlanEvangelista, bu kurs için eşit.
ngreen

Bu rpm2cpio kurulumu için root erişimine ihtiyaç duyar :(
törzsmókus

9
@AlanEvangelista rpm'nin bu kadar kötü bir format olduğuna şaşırıyorum. UNIX felsefesine bağlı basit arşivler gibi diğer deb'lerle karşılaştırıldığında.
Trismegistos

1
@SumitMurari Tabii ki kötü. Sadece törzsmókus'un çıkmazına bir çözüm öneriyordum.
MirroredFate

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

Referans için: cpio argümanları

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

Cevabı burada buldum: Lontar'ın cevabı


1
"rpm2cpio foo.rpm | cpio -idmv" benim için çalışıyor. Mevcut yoldaki rpm içeriğini çıkarmak yeterlidir.
parasrish

32

Rpm2cpio'lu olmayanlar için, bir * .rpm paketinden yükü ayıklayan eski rpm2cpio.sh betiği.

Gelecek nesiller için yeniden yayınlandı… ve gelecek nesil.

Şöyle çağırın: ./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 kullanarak bu hatayı "unlzma: bad lzma header" alıyorum. Birden fazla rpm denendi.
jekennedy

27

Bazen ara RPM arşiviyle ilgili bir sorunla karşılaşabilirsiniz:

cpio: Hatalı sayı
cpio: Hatalı sayı
cpio: Hatalı sayı
. . .
cpio: arşivin erken sonu

Bu, paketlenebileceği anlamına geliyor, bu günlerde her zamanki gibi LZMA2 sıkıştırması xz:

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

aksi takdirde deneyebilirsiniz:

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

2
Ben sadece bu karşılaştı. Teşekkürler!
Sam Stoelinga

2
Çok kullanışlı. Teşekkürler bayım!
ILIV

1
cankurtaran. @LasseHalbergHaarbye bunu kabul edilen cevaba ekledim.
Joseph Farah

"Hatalı biçimlendirilmiş sayı" ve "arşivin erken sonu" hatalarını alıyordum, ancak gönderilen çözümlerin hiçbiri benim için çalışmadı. rpm2cpio <file>.rpm | bsdtar -xf -Çalışması için (cpio yok) yapmam gerekiyordu .
jackkamm

Ara arşiv benim için gzip biçimlendirildi, bu yüzden gunzipyerine xzya lzmada iyi çalıştı kullandım .
jayhendren

9

Çoğu dağıtım, tar, zip, rpm ve çok daha fazlasını açan GUI uygulama dosya silindirini kurdu.

file-roller --extract-here package.rpm

Bu, geçerli dizindeki içeriği ayıklar.


6

7-zip , rpm ve dahil edilen cpio dahil olmak üzere çoğu arşiv türünü anlar.


7 zip ile denedim ve mükemmel çalıştı.
anshul

5

Siz de yapabilirsiniz tar -xvf <rpm file>!


Bir .rpm paketi ile çoğaltılamıyor. Cevabınızı düzeltmek isteyebilirsiniz.
gvlasov

9
OS X üzerinde bu işleri - veya bir varyantını kullanan başka sistem tarhangi kullanımlara libarchivebaşlık altında.
Glenjamin

2
Hatayı aldım: Bu bir tar arşivi gibi görünmüyor.
wp-overwatch.com

Bu benim için MacOS 10.14.1'de bsdtar 2.8.3 - libarchive 2.8.3 ile çalıştı. Hangi sıkıştırma türünün kullanıldığına bağlı olabilir. Rpm2cpio.sh betiği, ayıklama için doğru araca geçirmeden önce çeşitli sıkıştırma türlerini kontrol ediyor gibi görünüyor.
2xj

SO'nun düzenleme işlevi, cevabı düzeltmek için 3 karakter eklememe izin vermediğinden, bunun libarchive's gerektirdiğini de eklemeliyiz bsdtar. Mac'teki Homebrew tarvarsayılan olarak buna bağlanır, ancak diğer işletim sistemlerinde tarGNU katranı anlamına gelir.
Atemu

5

Güçlü metin tabanlı dosya yöneticisi mc (Midnight Commander, belirsiz bir şekilde eski DOS zamanlarının Norton Komutanını hatırlatır) .rpm ve .rpms dosyalarını denetleme ve açma yeteneğine sahiptir, sadece .rpm (s) dosyasını "açar" mc içinde seçin ve seçin CONTENTS.cpio: rpm için yükleme ağacına, rpms için .spec dosyasına ve tüm kaynak paketlerine erişebilirsiniz.




1

En azından OpenSuse'da, unrpmkomut paketle birlikte gelir build.

Uygun bir dizinde (bu bir arşiv bombası olduğu için):

unrpm file.rpm

1

.Rpm dosyasını ayrı bir klasöre kopyalayın ve ardından şu komutu çalıştırın: $ yourfile.rpm | cpio -idmv


Bu yorum olmalı
ketan

1

"DECOMPRESSION" testi, "grep" kontrolünün "xz" büyük / küçük harfe duyarlı olması nedeniyle, onun için en potansiyel olarak yararlı platformlardan biri olan CygWin'de başarısız oluyor. "COMPRESSION:" kontrolünün sonucu:

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

Basitçe 'grep -q' yerine 'grep -q -i' yerine her şey sorunu iyi çözüyor gibi görünüyor.

Özellikle bazı yorumlar ekleyerek ve "if" ifadeleri yerine "case" kullanarak birkaç güncelleme yaptım ve aşağıdaki düzeltmeyi ekledim

#!/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 içeriğini çıkarabilir. Tar.gz dosyasıyla aynı şekilde çalışır. Sıkıştırılmış bir dosyanın içindeki sıkıştırılmış bir dosya.

7-Zip yüklü Windows 7 Pro'da:

Rpm dosyasına sağ tıklayın. Bağlam menüsünde 7-Zip'in üzerine gelin. "Dosya adına" çıkartın.

Dosya adı klasörüne girin.

Cpio dosyasına sağ tıklayın. Bağlam menüsünde 7-Zip'in üzerine gelin. "Dosya adına" çıkartın.

Bitirdiniz. "Dosyaismi" olan klasör incelemek için çıkarılan içeriği içerir.

Linux adamlarının işlerin kolaylaştığını hor gördüğünü biliyorum, ancak uzun vadede, böyle basit bir sorunun çözümü için zaman harcamanız gerekiyorsa; bu verimsizliğin size maliyeti vardır.

Linux adamlarınızın verimli basitliği hor görmesi nedeniyle, 7-Zip'in Linux sürümünün aynı şeyi aynı şekilde yapacağından şüpheliyim.

Düpedüz aptallaşmayı zorlaştırabilir ve aynı zamanda bir dahi olduğunu iddia edebiliyorsanız neden kolaylaştınız?

Açık olmak gerekirse; Ben bir Windows hayranıyım. Aslında Linux'a geçmeyi düşünüyorum. Windows geliştiricilerinin sağduyu, en iyi geliştirici uygulamalarını yüzünüze görebileceği fırlatma fırsatına dayanamadım.

Sadece bunu gönderdiğim için mutlu ol ve Mark Harmon'ın yanında durmadığın için; Özel ajan Leroy Jethro Gibbs, başınızı kullanmamanız için size bir tokat vermişti.

Hangi Gibbs kuralının bu olduğunu bilmiyorum ama kural şudur: İşleri olması gerekenden daha zor hale getirmeyin.

Şimdi kimin tatile çıkması gerektiğini göreceğiz. Kendine iyi bak!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.