Wie extrahiere ich den Inhalt einer Drehzahl?


154

Ich habe eine Drehzahl und möchte sie wie einen Tarball behandeln. Ich möchte den Inhalt in ein Verzeichnis extrahieren, damit ich den Inhalt überprüfen kann. Ich bin mit den Abfragebefehlen eines deinstallierten Pakets vertraut. Ich möchte nicht einfach eine Liste des Inhalts der Drehzahl. dh

$ rpm -qpl foo.rpm

Ich möchte den Inhalt mehrerer Dateien überprüfen, die in der Drehzahl enthalten sind. Ich möchte die Drehzahl nicht installieren. Ich bin mir auch der Fähigkeit von rpms bewusst, zusätzliche Änderungen in den% post-Abschnitten vorzunehmen, und wie man diese überprüft. dh

$ rpm -qp --scripts foo.rpm

In diesem Fall geht mich das jedoch nichts an.

Antworten:


184

Hast du den rpm2cpioBefehl ausprobiert? Siehe das folgende Beispiel:

$ 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
Ich bin erstaunt, dass Linux-Distributionen keine ausführbare Wrapper-Datei bereitstellen, um dies zu vereinfachen (z. B. rpmextract bla.rpm), da dies eine sehr häufige Operation ist. Der Benutzer sollte sich nicht um das zwischengeschaltete cpio-Format kümmern müssen.
Alan Evangelista

2
Wundern Sie sich nicht, @AlanEvangelista, das ist selbstverständlich.
Ngreen

Dies erfordert Root-Zugriff für die Installation von rpm2cpio :(
törzsmókus

9
@ AlanEvangelista Ich bin erstaunt, dass RPM ein so schlechtes Format ist. Im Vergleich zu anderen wie deb, die nur einfache Archive sind, die der UNIX-Philosophie entsprechen.
Trismegistos

1
@ SumMurari Natürlich ist es schlecht. Ich habe nur eine Lösung für Törzsmókus 'Zwangslage angeboten.
MirroredFate

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

Als Referenz: Die cpio-Argumente sind

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

Ich fand die Antwort hier: Lontars Antwort


1
"rpm2cpio foo.rpm | cpio -idmv" funktioniert für mich. Es reicht aus, den Inhalt der Drehzahl im aktuellen Pfad zu extrahieren.
Parasrish

32

Für diejenigen, die nicht über rpm2cpio verfügen, ist hier das alte Skript rpm2cpio.sh, das die Nutzdaten aus einem * .rpm-Paket extrahiert.

Reposted für die Nachwelt… und die nächste Generation.

Rufen Sie wie folgt auf: ./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

Ich erhalte den Fehler "unlzma: bad lzma header" unter Alpine Linux. Versuchte mehrere U / min.
jekennedy

27

Manchmal kann ein Problem mit dem RPM-Zwischenarchiv auftreten:

cpio: Fehlgebildete Nummer
cpio: Fehlgebildete Nummer
cpio: Fehlgebildete Nummer
. . .
cpio: vorzeitiges Ende des Archivs

Das heißt, es könnte verpackt werden, heutzutage handelt es sich wie gewohnt um LZMA2-Komprimierung durch xz:

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

Andernfalls könnten Sie versuchen:

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

2
Ich bin gerade darauf gestoßen. Vielen Dank!
Sam Stoelinga

2
Sehr hilfreich. Danke mein Herr!
ILIV

1
Lebensretter. @LasseHalbergHaarbye Ich habe es der akzeptierten Antwort hinzugefügt.
Joseph Farah

Ich habe die Fehler "Fehlgebildete Nummer" und "Vorzeitiges Ende des Archivs" erhalten, aber keine der veröffentlichten Lösungen hat für mich funktioniert. Ich musste tun rpm2cpio <file>.rpm | bsdtar -xf -(kein cpio), damit es funktionierte.
Jackkamm

Das Zwischenarchiv wurde für mich gzip-formatiert, daher habe ich es gunzipanstelle von xzoder verwendet, lzmawas gut funktioniert hat.
Jayhendren

9

Die meisten Distributionen haben den File-Roller der GUI-App installiert, der Teer, Zip, RPM und vieles mehr entpackt.

file-roller --extract-here package.rpm

Dadurch wird der Inhalt im aktuellen Verzeichnis extrahiert.


6

7-zip versteht die meisten Arten von Archiven, einschließlich RPM und dem enthaltenen CPIO.


Ich habe es mit 7 Reißverschlüssen versucht und es hat perfekt funktioniert.
Anshul

5

Sie können es einfach auch tun tar -xvf <rpm file>!


Mit einem .rpm-Paket kann das nicht reproduziert werden. Vielleicht möchten Sie Ihre Antwort korrigieren.
Gvlasov

9
Dies funktioniert unter OS X - oder jedem anderen System, das eine Variante tarverwendet, die libarchiveunter der Haube verwendet wird.
Glenjamin

2
Ich habe den Fehler bekommen: Dies sieht nicht wie ein Teerarchiv aus.
wp-overwatch.com

Dies funktionierte für mich unter MacOS 10.14.1 mit bsdtar 2.8.3 - libarchive 2.8.3. Dies kann davon abhängen, welche Art der Komprimierung verwendet wurde. Das Skript rpm2cpio.sh scheint nach verschiedenen Arten der Komprimierung zu suchen, bevor es zur Extraktion an das richtige Tool übergeben wird.
2xj

Da ich mit der Bearbeitungsfunktion von SO keine 3 Zeichen hinzufügen kann, um die Antwort zu korrigieren, sollte hinzugefügt werden, dass hierfür Libarchive erforderlich sind bsdtar. Homebrew auf Mac verbindet tarsich standardmäßig damit, aber auf anderen Betriebssystemen tarbedeutet GNU tar.
Atemu

5

Der leistungsstarke textbasierte Dateimanager mc (Midnight Commander, der den Norton Commander vage an alte DOS-Zeiten erinnert) verfügt über die integrierte Funktion zum Überprüfen und Entpacken von RPM- und RPM-Dateien. Öffnen Sie einfach die RPM-Datei in mc und wählen Sie CONTENTS.cpio: Für eine Drehzahl erhalten Sie Zugriff auf den Installationsbaum, für eine Drehzahl erhalten Sie Zugriff auf die .spec-Datei und alle Quellpakete.




1

Zumindest in OpenSuse wird der unrpmBefehl mit dem buildPaket geliefert.

In einem geeigneten Verzeichnis (da dies eine Archivbombe ist):

unrpm file.rpm

1

Kopieren Sie die RPM-Datei in einen separaten Ordner und führen Sie den folgenden Befehl $ yourfile.rpm | aus cpio -idmv


Dies sollte ein Kommentar sein
Ketan

1

Der "DECOMPRESSION" -Test schlägt auf CygWin, einer der potenziell nützlichsten Plattformen, fehl, da bei der "grep" -Prüfung auf "xz" zwischen Groß- und Kleinschreibung unterschieden wird. Das Ergebnis der Prüfung "COMPRESSION:" lautet:

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

Das einfache Ersetzen von 'grep -q' durch 'grep -q -i' scheint das Problem gut zu lösen.

Ich habe einige Aktualisierungen vorgenommen, insbesondere einige Kommentare hinzugefügt und "case" anstelle von gestapelten "if" -Anweisungen verwendet, und diesen Fix unten eingefügt

#!/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 kann den Inhalt extrahieren. Es funktioniert genauso wie eine tar.gz-Datei. Eine komprimierte Datei in einer komprimierten Datei.

Unter Windows 7 Pro mit installiertem 7-Zip:

Klicken Sie mit der rechten Maustaste auf die RPM-Datei. Fahren Sie mit der Maus über 7-Zip im Kontextmenü. Wählen Sie Auszug zu "Dateiname".

Geben Sie in den Dateinamenordner ein.

Klicken Sie mit der rechten Maustaste auf die CPIO-Datei. Fahren Sie mit der Maus über 7-Zip im Kontextmenü. Wählen Sie Auszug zu "Dateiname".

Du bist fertig. Der Ordner mit "Dateiname" enthält den extrahierten Inhalt zur Überprüfung.

Ich weiß, dass Sie Linux-Leute es verachten, Dinge einfach zu machen, aber auf lange Sicht, wenn Sie Zeit damit verbringen müssen, eine Lösung für ein einfaches Problem wie dieses zu finden; Diese Ineffizienz kostet Sie Geld.

Angesichts der Tatsache, dass Sie Linux-Leute effiziente Einfachheit verachten, bezweifle ich sehr, dass die Linux-Version von 7-Zip genau das Gleiche tun wird.

Warum es einfach machen, wenn man es geradezu dumm machen und gleichzeitig behaupten kann, ein Genie zu sein?

Nur um das klar zu stellen; Ich bin kein Windows-Fan. Ich bin gerade dabei, auf Linux umzusteigen. Ich konnte der Gelegenheit einfach nicht widerstehen, das, was Windows-Entwickler als vernünftige, bewährte Entwicklerpraktiken ansehen würden, in Ihre Gesichter zu reiben.

Sei einfach froh, dass ich das poste und du hast Mark Harmon nicht neben dir. Spezialagent Leroy Jethro Gibbs hätte Ihnen einen Schlag auf den Kopf gegeben, weil Sie Ihren Kopf nicht benutzt haben.

Ich weiß nicht, um welche Gibbs-Regel es sich handelt, aber die Regel lautet: Machen Sie sich die Dinge nicht schwerer, als sie sein müssen.

Jetzt können wir sehen, wer Urlaub machen muss. Pass auf!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.