Descifrado y descomprimido combinado de un archivo

Descifrado y descomprimido combinado de un archivo

Tengo un archivo cifrado como file.zip.gpg.

El descifrado se realiza usando gpg --output file.zip --decrypt file.zip.gpgy descomprimiendo el contenido del archivo 7z(a) x file.zipdespués.

El primer comando obviamente crea un archivo (temporal). Me gustaría saber si ambos comandos se podrían combinar en un solo comando (¿tubería?) para evitar la creación del archivo temporal en el disco.

Lo intenté

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

pero las 7zsalidas aparecen antes de gpgsolicitar la frase de contraseña: Extracting archive: ERROR: Can not open the file as archive.

Respuesta1

no etiquetaste, pero el nombre del archivo contiene .zip, así que supongo que después de descifrarlo es realmente un archivo zip.

Veresta respuesta:

El formato de archivo ZIP incluye un directorio (índice) al final del archivo. Este directorio indica dónde, dentro del archivo, se encuentra cada archivo y, por lo tanto, permite un acceso rápido y aleatorio, sin tener que leer todo el archivo.

Esto parece plantear un problema al intentar leer un archivo ZIP a través de una tubería, ya que no se accede al índice hasta el final y, por lo tanto, los miembros individuales no se pueden extraer correctamente hasta que el archivo se haya leído por completo y ya no esté disponible. . Como tal, no parece sorprendente que la mayoría de los descompresores ZIP simplemente fallen cuando el archivo se suministra a través de una tubería.

El directorio al final del archivo no es la única ubicación donde se almacena la metainformación del archivo. Además, las entradas individuales también incluyen esta información en un encabezado de archivo local, por motivos de redundancia.

Aunque no todos los descompresores ZIP utilizarán encabezados de archivos locales cuando el índice no esté disponible, las interfaces tary (también conocidas como y ) pueden hacerlo y lo harán al leer a través de una tubería, […]cpiolibarchivebsdtarbsdcpio

En mi Debian 9 la solución con bsdtar(del libarchive-toolspaquete) funciona:

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

Otras respuestas proporcionan otras soluciones. Algunos de ellos usan un archivo temporal disfrazado (por ejemplo, =( … )en zsh), otros no (por ejemplo busybox unzip -, pero este no funciona para mí).


Si el formato fuera 7z en lugar de zip, entonces el problema sería similar. Comparareste hilo:

Tratando de atravesar7za

Estoy intentando ejecutar 7zauna canalización dentro de un programa C++. […]

Lo mismo si intento hacerlo en la línea de comando.

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

E_NOTIMPL

La respuesta de Igor Pavlov (el creador de 7-zip) es:

7-zip necesita una operación de "búsqueda" para archivos 7z. Por lo tanto, no puede utilizarlo -sipara extraer del archivo 7z.

Esto tiene fecha del 30 de marzo de 2016. mis pruebas yel registro de cambiosindique que la declaración sigue siendo válida en 2019. Además, bsdtaren mi Debian no puedo ayudar, produce Error seeking in stdin. supongo que el formato 7zen realidadnecesita un archivo buscable.

información relacionada