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.

Jeff Sheffield
quelle

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 
linux_fanatic
quelle
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

Jeff Sheffield
quelle
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
Jeff Johnson
quelle
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
Turm
quelle
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.

erik
quelle
6

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

Jan Hudec
quelle
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>!

Melissa
quelle
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.

Davide Cesari
quelle
1

Zumindest in OpenSuse wird der unrpmBefehl mit dem buildPaket geliefert.

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

unrpm file.rpm
user2394284
quelle
1

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

Apurbojha
quelle
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
Nico Kadel-Garcia
quelle
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!

Scott Tovey
quelle