Ich habe eine verschlüsselte Datei wie file.zip.gpg
.
Die Entschlüsselung erfolgt mit gpg --output file.zip --decrypt file.zip.gpg
und das Entpacken des Archivinhalts 7z(a) x file.zip
anschließ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 7z
Ausgabe erscheint, bevor gpg
nach der Passphrase gefragt wird: Extracting archive: ERROR: Can not open the file as archive
.
Antwort1
Du hast nicht getaggtReißverschluss, 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
tar
undcpio
Frontendslibarchive
(auch bekannt alsbsdtar
undbsdcpio
) dies beim Lesen durch eine Pipe tun, […]
In meinem Debian 9 funktioniert die Lösung mit bsdtar
(aus libarchive-tools
dem 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, durchzuleiten
7za
7za
Ich 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
-si
zum 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 bsdtar
kann in meinem Debian nicht geholfen werden, es ergibtError seeking in stdin
. Ich denke, das 7z-FormatWirklichbenötigt eine suchbare Datei.