Kombiniertes Entschlüsseln und Entpacken einer Datei

Kombiniertes Entschlüsseln und Entpacken einer Datei

Ich habe eine verschlüsselte Datei wie file.zip.gpg.

Die Entschlüsselung erfolgt mit gpg --output file.zip --decrypt file.zip.gpgund das Entpacken des Archivinhalts 7z(a) x file.zipanschließend mit.

Der erste Befehl erstellt offensichtlich eine (temporäre) Datei. Ich wüsste gerne, ob beide Befehle zu einem einzigen Befehl (Pipe?) kombiniert werden könnten, um die Erstellung der temporären Datei auf der Festplatte zu verhindern.

Ich habe es versucht

gpg --decrypt file.zip.gpg | 7z x -si

aber die 7zAusgabe erscheint, bevor gpgnach der Passphrase gefragt wird: Extracting archive: ERROR: Can not open the file as archive.

Antwort1

Du hast nicht getaggt, aber der Dateiname enthält .zip, daher gehe ich davon aus, dass es sich nach der Entschlüsselung wirklich um eine ZIP-Datei handelt.

Sehendiese Antwort:

Das ZIP-Dateiformat enthält am Ende des Archivs ein Verzeichnis (Index). Dieses Verzeichnis gibt an, wo sich innerhalb des Archivs jede Datei befindet und ermöglicht so einen schnellen, wahlfreien Zugriff, ohne das gesamte Archiv lesen zu müssen.

Dies scheint ein Problem darzustellen, wenn versucht wird, ein ZIP-Archiv über eine Pipe zu lesen, da der Index erst ganz am Ende aufgerufen wird und einzelne Mitglieder daher erst richtig extrahiert werden können, wenn die Datei vollständig gelesen wurde und nicht mehr verfügbar ist. Daher ist es nicht überraschend, dass die meisten ZIP-Dekomprimierer einfach versagen, wenn das Archiv über eine Pipe bereitgestellt wird.

Das Verzeichnis am Ende des Archivs ist nicht der einzige Ort, an dem Dateimetainformationen im Archiv gespeichert werden. Darüber hinaus enthalten einzelne Einträge diese Informationen aus Redundanzgründen auch in einem lokalen Dateiheader.

Obwohl nicht jeder ZIP-Dekomprimierer lokale Dateiheader verwendet, wenn der Index nicht verfügbar ist, können und werden die tarund cpioFrontends libarchive(auch bekannt als bsdtarund bsdcpio) dies beim Lesen durch eine Pipe tun, […]

In meinem Debian 9 funktioniert die Lösung mit bsdtar(aus libarchive-toolsdem Paket):

gpg --decrypt file.zip.gpg | bsdtar -xvf-

Andere Antworten bieten andere Lösungen. Einige davon verwenden eine getarnte temporäre Datei (z. B. =( … )in zsh), andere nicht (z. B. busybox unzip -, aber das hier funktioniert bei mir nicht).


Wenn das Format 7z statt zip wäre, wäre das Problem ähnlich. Vergleichen Siedieser Thread:

Versuch, durchzuleiten7za

7zaIch versuche , eine Pipeline innerhalb eines C++-Programms auszuführen . […]

Dasselbe gilt, wenn ich versuche, es über die Befehlszeile zu tun.

7za e -an -si -so < filename.7z >/dev/null
ERROR:
Can not open the file as archive

E_NOTIMPL

Die Antwort von Igor Pavlov (dem Erfinder von 7-zip) lautet:

7-zip benötigt eine „Such“-Operation für 7z-Archive. Sie können es also nicht -sizum Entpacken aus 7z-Archiven verwenden.

Dies war vom 30.03.2016. Meine Tests unddas Changelogzeigen, dass die Aussage auch im Jahr 2019 noch gültig ist. Außerdem bsdtarkann in meinem Debian nicht geholfen werden, es ergibtError seeking in stdin . Ich denke, das 7z-FormatWirklichbenötigt eine suchbare Datei.

verwandte Informationen