Eu tenho um arquivo criptografado como file.zip.gpg
.
A descriptografia é feita usando gpg --output file.zip --decrypt file.zip.gpg
e descompactando o conteúdo do arquivo 7z(a) x file.zip
posteriormente.
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 7z
saídas aparecem antes de gpg
solicitar a senha: Extracting archive: ERROR: Can not open the file as archive
.
Responder1
Você não marcoufecho eclair, 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
tar
frontcpio
-ends e paralibarchive
(também conhecidos comobsdtar
ebsdcpio
) podem e farão isso ao ler através de um canal, [...]
No meu Debian 9 a solução com bsdtar
(do libarchive-tools
pacote) 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 passar
7za
Estou tentando executar
7za
um 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
-si
extrair 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, bsdtar
no meu Debian não posso ajudar, ela rende Error seeking in stdin
. Eu acho que o formato 7zrealmenteprecisa de um arquivo pesquisável.