Descriptografia e descompactação combinadas de um arquivo

Descriptografia e descompactação combinadas de um arquivo

Eu tenho um arquivo criptografado como file.zip.gpg.

A descriptografia é feita usando gpg --output file.zip --decrypt file.zip.gpge descompactando o conteúdo do arquivo 7z(a) x file.zipposteriormente.

O primeiro comando obviamente cria um arquivo (temporário). Gostaria de saber se os dois comandos poderiam ser combinados em um único comando (pipe?) para evitar a criação do arquivo temporário no disco.

tentei

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

mas as 7zsaídas aparecem antes de gpgsolicitar a senha: Extracting archive: ERROR: Can not open the file as archive.

Responder1

Você não marcou, mas o nome do arquivo contém .zip, então presumo que depois de descriptografar seja realmente um arquivo zip.

Veresta resposta:

O formato de arquivo ZIP inclui um diretório (índice) no final do arquivo. Este diretório indica onde, dentro do arquivo, cada arquivo está localizado e, portanto, permite um acesso rápido e aleatório, sem ler o arquivo inteiro.

Isto parece representar um problema ao tentar ler um arquivo ZIP através de um canal, pois o índice não é acessado até o final e, portanto, os membros individuais não podem ser extraídos corretamente até que o arquivo tenha sido totalmente lido e não esteja mais disponível . Como tal, não parece surpreendente que a maioria dos descompressores ZIP simplesmente falhem quando o arquivo é fornecido através de um tubo.

O diretório no final do arquivo não é o único local onde as metainformações do arquivo são armazenadas no arquivo. Além disso, as entradas individuais também incluem essas informações em um cabeçalho de arquivo local, para fins de redundância.

Embora nem todo descompressor ZIP use cabeçalhos de arquivo locais quando o índice não estiver disponível, os tarfront cpio-ends e para libarchive(também conhecidos como bsdtare bsdcpio) podem e farão isso ao ler através de um canal, [...]

No meu Debian 9 a solução com bsdtar(do libarchive-toolspacote) funciona:

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

Outras respostas fornecem outras soluções. Alguns deles usam um arquivo temporário disfarçado (por exemplo, =( … )em zsh), outros não (por exemplo busybox unzip -, mas este não funciona para mim).


Se o formato fosse 7z em vez de zip, o problema seria semelhante. Comparareste tópico:

Tentando passar7za

Estou tentando executar 7zaum pipeline dentro de um programa C++. […]

A mesma coisa se eu tentar fazer isso na linha de comando.

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

E_NOTIMPL

A resposta de Igor Pavlov (o criador do 7-zip) é:

O 7-zip precisa da operação de "busca" para arquivos 7z. Portanto, você não pode -siextrair do arquivo 7z.

Esta foi datada de 30/03/2016. Meus testes eo registro de alteraçõesindica que a declaração ainda é válida em 2019. Além disso, bsdtarno meu Debian não posso ajudar, ela rende Error seeking in stdin. Eu acho que o formato 7zrealmenteprecisa de um arquivo pesquisável.

informação relacionada