ZIP, tar.gz und gzip mit cURL herunterladen und entpacken
Leiten Sie cURL per Pipe an tar oder gzip
weiter, um einen Download bereits beim Empfang zu entpacken. Laden Sie ZIP-Dateien zuerst in eine
temporäre Datei herunter und führen Sie dann unzip aus. Die folgenden
Beispiele prüfen sowohl den Download als auch das Entpacken und verwenden kein bereits vorhandenes
Ausgabeverzeichnis.
Grundlegende cURL-Befehle zum Herunterladen
Verwenden Sie Bash unter Linux, cURL, GNU tar, GNU gzip, Info-ZIP UnZip und die
Standardprogramme mkdir, mktemp und
rm. Die Befehle wurden unter Ubuntu 24.04 mit Bash 5.2, cURL 8.5.0,
GNU tar 1.35, gzip 1.12 und UnZip 6.00 getestet. Es handelt sich weder um PowerShell-Befehle noch um
allgemeine Befehle für sh.
Wählen Sie den Block für Ihr Format und ersetzen Sie darin die URL https://example.com/…
durch eine vertrauenswürdige Download-URL. Führen Sie den vollständigen Block einschließlich der
Klammern in Bash aus, und zwar in einem Verzeichnis, das Ihnen gehört und in dem Sie schreiben dürfen.
Jeder Block funktioniert eigenständig. Sie können einen Block auch als extract.sh
speichern und bash extract.sh ausführen.
Hier werden folgende cURL-Optionen verwendet:
-f: Gibt bei HTTP-Fehlern wie 404 einen Fehler zurück, ohne die Fehlerseite an das Entpackprogramm weiterzugeben.-sS: Blendet die Fortschrittsanzeige aus, gibt Fehler aber weiterhin aus.-L: Folgt Weiterleitungen.-o: Schreibt den Download in die angegebene Datei statt auf die Standardausgabe.
Das Ausgabeverzeichnis darf nicht existieren, auch nicht als leeres Verzeichnis.
mkdir reserviert es vor Beginn jedes Downloads; ändern Sie diesen Befehl
nicht in mkdir -p. Der Trap zum Aufräumen wird erst nach erfolgreicher
Erstellung eingerichtet. Eine erneute Ausführung lässt das vorherige Ergebnis daher unverändert.
umask 077 macht neu erstellte Arbeitsverzeichnisse nur für Ihren Benutzer
zugänglich, wobei Archiveinträge eigene Zugriffsrechte mitbringen können.
Umgang mit verschiedenen Archivformaten
ZIP-Archive (.zip)
Info-ZIP UnZip 6.0 liest keine Archive von stdin. Seine Option -p
sendet entpackte Dateien an stdout; sie akzeptiert keine ZIP-Pipe als Eingabe. Das
UnZip-Handbuch dokumentiert diese Einschränkung. Verwenden Sie eine
reguläre heruntergeladene Datei, damit das Entpackprogramm darin frei auf Positionen zugreifen kann.
(
umask 077
dest='./zip-output'
mkdir -- "$dest" || exit
trap 'rm -rf -- "$dest"' EXIT
work=$(mktemp -d) || exit
trap 'rm -rf -- "$work" "$dest"' EXIT
curl -fsSL 'https://example.com/archive.zip' -o "$work/archive.zip" || exit
unzip -q "$work/archive.zip" -d "$dest" </dev/null || exit
rm -rf -- "$work" || exit
trap - EXIT
printf 'Extracted to %s\n' "$dest"
)
Bei Erfolg liegen die Dateien unter ./zip-output/, wobei ihre archivierte
Verzeichnisstruktur erhalten bleibt. mktemp -d erstellt ein eindeutiges
temporäres Verzeichnis in $TMPDIR oder, falls nicht gesetzt, in
/tmp. Nur diese private Kopie von archive.zip wird
entfernt. Eine Datei namens temp.zip im aktuellen Verzeichnis wird nie
verwendet. Dieses Beispiel gilt für unverschlüsselte ZIP-Dateien. Das Schließen von stdin verhindert,
dass eine interaktive Eingabeaufforderung den Befehl aufhält.
tar-gzip-Archive (.tar.gz oder .tgz)
Ein gzip-komprimiertes tar-Archiv lässt sich direkt als Stream an GNU tar weitergeben:
(
set -o pipefail
umask 077
dest='./tar-output'
mkdir -- "$dest" || exit
trap 'rm -rf -- "$dest"' EXIT
curl -fsSL 'https://example.com/archive.tar.gz' | tar -xzf - -C "$dest" || exit
trap - EXIT
printf 'Extracted to %s\n' "$dest"
)
Hier extrahiert -x die Dateien, -z
dekomprimiert gzip, -f - liest das Archiv von stdin und
-C wählt das Zielverzeichnis zum Entpacken. Die Dateien landen unter
./tar-output/; es wird kein komprimiertes Archiv gespeichert. Enthält das Archiv
ein Verzeichnis auf oberster Ebene, bleibt dieses innerhalb von tar-output
erhalten.
Die Bash-Option pipefail lässt die Pipeline
fehlschlagen, wenn entweder cURL oder tar fehlschlägt. Ohne sie kann ein erfolgreiches Entpacken eine
fehlgeschlagene Übertragung verbergen, selbst wenn diese erst nach der Übertragung nutzbarer
Archivbytes einen Fehler meldet. || exit gibt den Fehlerstatus der Subshell
zurück und löst das Aufräumen aus. Die Klammern verhindern, dass diese Shell-Einstellungen und die
Aufrufe von exit Ihre interaktive Sitzung beeinflussen.
Gzip-Archive (.gz)
Reines gzip komprimiert einen Bytestrom; es stellt keinen Verzeichnisbaum bereit. Wählen Sie den
Ausgabedateinamen explizit mit gzip -dc und einer Umleitung:
(
set -o pipefail
umask 077
dest='./gzip-output'
mkdir -- "$dest" || exit
trap 'rm -rf -- "$dest"' EXIT
curl -fsSL 'https://example.com/file.gz' | gzip -dc > "$dest/payload" || exit
trap - EXIT
printf 'Decompressed to %s/payload\n' "$dest"
)
-d dekomprimiert und -c schreibt auf stdout.
Das Ergebnis ist ./gzip-output/payload, auch wenn die Originaldatei leer ist oder Binärdaten
enthält. Das umgebende Verzeichnis verhindert, dass die Umleitung ein älteres Ergebnis abschneidet.
Enthält eine Datei namens .gz tatsächlich ein tar-Archiv, verwenden Sie
das tar-Beispiel mit dieser URL, um die enthaltenen Dateien zu extrahieren.
Sicherheitsaspekte
Verwenden Sie diese Befehle für Archive aus einer vertrauenswürdigen Quelle und unter Ihrem normalen
Benutzerkonto. Das neue Verzeichnis schützt vorhandene Ausgaben vor versehentlicher Wiederverwendung;
es ist keine Sandbox. Archivpfade, Links, Zugriffsrechte, Sicherheitslücken im Entpackprogramm und
eine übermäßige Größe nach dem Entpacken bleiben relevant. Die
Sicherheitshinweise von GNU tar erläutern die Risiken beim Entpacken
nicht vertrauenswürdiger Archive. --strip-components ändert die Pfadstruktur; es macht
ein beliebiges Archiv nicht sicher.
Beim Streaming beginnt das Schreiben von Dateien, bevor die Übertragung abgeschlossen ist. Warten Sie auf den Exit-Status null und die Erfolgsmeldung, bevor Sie die Dateien verwenden. Bei einem Download- oder Entpackfehler entfernt der Trap das neu erstellte Ausgabeverzeichnis. Ein erzwungener Abbruch oder ein Berechtigungsfehler beim Aufräumen kann unvollständige Dateien hinterlassen. Prüfen Sie dieses Verzeichnis, bevor Sie ein neues Ziel für einen erneuten Versuch wählen.
Häufige Probleme und Tipps zur Fehlerbehebung
- Das Ziel existiert bereits: Wählen Sie einen neuen Namen für
dest. Der Befehl schlägt bewusst vor dem Download fehl und bewahrt so das vorhandene Verzeichnis, die Datei oder den symbolischen Link. - cURL meldet einen HTTP- oder Verbindungsfehler: Prüfen Sie die Download-URL und die Zugriffsvoraussetzungen. Eine Webseite, die HTTP 200 zurückgibt, ist noch kein Archiv; auch das Entpackprogramm muss den heruntergeladenen Inhalt akzeptieren.
- Das Entpackprogramm meldet ein unerwartetes EOF, einen Prüfsummenfehler oder ein ungültiges Format:
Betrachten Sie das Ergebnis als fehlgeschlagen. Bestätigen Sie das Format und beziehen Sie eine
vollständige Kopie vom Herausgeber. Die Endung
.gzallein sagt nicht aus, ob der Inhalt ein tar-Archiv ist. - Eine Übertragung bricht immer wieder ab: Führen Sie nach Behebung der Ursache den gesamten Block erneut aus. Ergänzen Sie eine Pipe nicht einfach um Optionen für erneute Versuche: cURL kann bereits weitergegebene Bytes nicht zurückholen. Die Dokumentation zu erneuten Versuchen warnt davor, dass umgeleitete Ausgaben doppelte Daten erhalten können.
- Beim Entpacken geht der Speicherplatz aus: Planen Sie Platz für die entpackten Dateien ein. Das ZIP-Beispiel benötigt außerdem Platz für das heruntergeladene Archiv im temporären Verzeichnis.
Entscheiden, wann das Archiv gespeichert werden soll
Streaming von tar.gz und gzip spart den Speicherplatz für den komprimierten Download. Wenn Sie eine Prüfsumme des Herausgebers vergleichen oder eine Signatur vor dem Entpacken verifizieren müssen, laden Sie zuerst in ein neues Arbeitsverzeichnis herunter und prüfen Sie diese Datei. Akzeptiert ein Entpackprogramm das Archiv, belegt das nur, dass es dieses lesen konnte; es belegt nicht, wer es veröffentlicht hat.
