Wie kann man sicher entpacken, ohne das aktuelle Verzeichnis im Falle einer Tarbomb zu verschmutzen?

33

Respektable Projekte freigeben tar - Archiven , die ein einzelnes Verzeichnis enthalten, zum Beispiel zyrgus-3.18.tar.gzeinen enthält zyrgus-3.18Ordner, die wiederum enthält src, build, distetc.

Bei einigen Punk-Projekten steht jedoch alles an der Wurzel: '- (Dies führt zu einem völligen Durcheinander beim Aufheben der Archivierung. Manuelles Erstellen eines Ordners ist jedes Mal mühsam und die meiste Zeit überflüssig.

  • Gibt es eine superschnelle Methode, um festzustellen, ob eine .tar- oder .tar.gz-Datei mehr als ein einzelnes Verzeichnis im Stammverzeichnis enthält? Auch für ein großes Archiv.
  • Oder noch besser, gibt es ein Tool, das in solchen Fällen ein Verzeichnis (Name des Archivs ohne die Erweiterung) erstellt und alles darin ablegt?
Nicolas Raoul
quelle
2
Ich denke, defekte Verpackungen sind einen Fehlerbericht an den Paketautor wert.
14
Ich habe historisch (seit Mitte der 90er Jahre) einfach immer in ein Unterverzeichnis entpackt. Wenn alles in einem einzigen Verzeichnis abgelegt ist (wie es sein sollte), kann der Inhalt mit mv an die richtige Stelle verschoben werden, und Sie können das überflüssige zusätzliche Verzeichnis löschen. Zwei zusätzliche Schritte, ja, aber es ist besser, das Chaos aus einer falsch erstellten Teer-Datei zu entfernen.
TED
6
But some punk projects put everything at the root :'-(Bei einigen Punk-Projekten wird alles völlig unnötig in einem Ordner abgelegt, wenn man bedenkt, dass sich bereits alles in einem umschließenden Archiv befindet. Wenn Sie es herunterladen und in einen eigenen Ordner entpacken, wie es ein intelligenter Benutzer tun würde, werden Sie am Ende mit all dem fertig Inhalt begrub eine weitere Schicht nach unten. ;-)
Mason Wheeler
2
@MasonWheeler Es gibt eine Art "De-facto-Standard" für Tar-Archive, in dem sich alles in einem Ordner befindet.
glglgl

Antworten:

30

patool verarbeitet verschiedene Arten von Archiven und erstellt ein Unterverzeichnis, falls das Archiv mehrere Dateien enthält, um ein Überfüllen des Arbeitsverzeichnisses mit den extrahierten Dateien zu verhindern.

Archiv extrahieren

patool extract archive.tar

Verwenden Sie, um eine Liste der unterstützten Formate zu erhalten patool formats.

Marco
quelle
Zu Ihrer Information: Gefunden unter sourceforge.net/projects/patool . Es ist eine Umdrehungszahl und ich habe aliensie in eine Deb für Ubuntu umgewandelt.
Joe
patoolsollte in den Repos für Debian und Ubuntu sein, wenn Sie eine aktuelle Version ausführen.
Marco
12

Sie könnten so etwas tun

tar tf thefile.tar | cut -d/ -f1 | sort -u

um zu sehen, welche Top-Level-Einträge ein Teer hat; Pipe, um wc -lzu überprüfen, ob es mehr als eine gibt. Beachten Sie, dass es einige Fälle gibt, in denen dies fehlschlagen würde, z. B. wenn der Teer Dateipfade des Formulars somedir/whateverund auch ./somedir/whatever(oder etwas verrückteres) enthält. Dies sollte jedoch ungewöhnlich sein.

Dadurch wird die gesamte TAR-Datei gelesen, bevor etwas ausgegeben wird. Dies sortsollte jedoch schneller sein als das eigentliche Extrahieren, da nur ein sequenzieller Lesevorgang ausgeführt wird und große Dateien übersprungen werden können.

Wenn Sie dies interaktiv tun und die Datei möglicherweise groß ist, können Sie sort -uzu uniqund Control+ wechseln , Cwenn mehr als eine Sache gedruckt wird.

Dougal
quelle
2
sort | uniqkann auf gekürzt werden sort -u.
Marco
4
es sei denn, Sie möchten tununiq -c
cas
7

du kannst tun:

pax <some.tar

... um den Inhalt einer tarDatei aufzulisten.

Wenn Sie wissen möchten, wie viele Ebenen tief es geht, können Sie Folgendes tun:

pax <some.tar | tr -dc /\\n | sort -r | head -n1

Sie können eine Explosion beim Extrahieren ausdrücklich verbieten mit:

mkdir some.tar
pax -'rs|^|some.tar/|' <some.tar
mikeserv
quelle
2

Dies sollte tun, was Sie wollen. Ich bin sicher, jemand kann es verbessern. In diesen Beispielen gehe ich von einem gzip-komprimierten Tar-Archiv aus, da dies am häufigsten vorkommt.

Sie möchten ein Archiv, in dem sich keine Geschwisterknoten im Verzeichnisbaum auf Stammebene befinden.

Jeder Eintrag in der Teer-Inhaltsliste muss mit demselben Muster beginnen. Dieses Muster ist der Basisverzeichnispfad, den alle Einträge im Archiv gemeinsam nutzen müssen. Wenn zwei Einträge nicht mit demselben Muster beginnen, sind sie Geschwister.

Die erste Zeile in der Teer-Inhaltsliste gibt Ihnen das minimale Muster an, nach dem Sie suchen müssen. Dies ist der BASEPATH.

BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))

Um auf explosive Tarballs zu testen, müssen Sie überprüfen, ob eine Zeile der Teerinhaltsliste nicht mit dem BASEPATH beginnt.

tar ztf example.tar.gz | grep -qv "^${BASEPATH}"

Verwandle dies in eine Shell-Funktion:

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

Von hier aus können Sie eine sichere Funktion zum Extrahieren von Teerarchiven schreiben.

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

safe_tar_x() {
    TARBALL_NAME=$1
    if is_explosive ${TARBALL_NAME}; then
        SUBDIR=${TARBALL_NAME%.tar.gz}
        SUBDIR=${SUBDIR##*/}
        mkdir "${SUBDIR}"
        echo "WARNING: This tarball is explosive. Opening in subdirectory, ${SUBDIR}, for safety." >&2
    else
        SUBDIR="."
    fi
    # Tar quirks: "--directory" must be last, and using more than
    #     one option group requires that all groups start with a dash.
    tar -zxf "${TARBALL_NAME}" --directory "${SUBDIR}"
    return $?
}
Noah Spurrier
quelle