
Se eu tiver um arquivo binário assinado de 100 MB que baixei da Internet, preciso de 200 MB de espaço em disco para abri-lo. O arquivo está apenas assinado, não criptografado.
Quando o espaço em disco é baixo, não é possível obter o arquivo original porque o comando gpg falha. Vi que o arquivo gpg assinado é o arquivo original + alguns bytes de assinatura no início e no final. É possível retirar esses bytes do arquivo sem criar um novo arquivo, economizando espaço em disco? A assinatura pode ser verificada usando:
# gpg --verify filename.gpg
sem criar um novo arquivo no disco. Um exemplo de fluxo de trabalho é descrito abaixo:
# # Sample workflow
# cd /tmp/new
# wget http://someaddress/filename.gpg
# ls
filename.gpg
# du -h filename.gpg
100M filename.gpg
# gpg filename.gpg
gpg: Signature made Thu May 28 10:53:26 2015 UTC using RSA key ID XXXXXXXXX
gpg: Good signature from "Example <[email protected]>"
# ls
filename filename.gpg
# du -ch *
100M filename
100M filename.gpg
200M total
# rm filename.gpg
Quando o espaço em disco estiver baixo, o comando gpg filename.gpg falhará.
Responder1
Você pode combinar o processo de download e verificar a assinatura em um processo canalizado como este:
wget -qO- http://someaddress/filename.gpg|gpg >filename
Responder2
Sim, você pode remover bytes do início e do fim sem usar mais espaço em disco. A maioria dos utilitários, entretanto, copiará o arquivo para um novo arquivo, excluirá o antigo e, em seguida, renomeará o novo para ser igual ao antigo. Acho que é seguro assumir gpg
que está nesta categoria. Isso usa o dobro do espaço em disco necessário para o arquivo, é claro.
O que você precisa fazer é:
- No local, mova os bytes do arquivo "para baixo" pelo tamanho do cabeçalho PGP
- Defina o comprimento do arquivo para remover o trailer PGP
Com o utilitário certo, seria possível fazer isso em uma única etapa, e seria fácil escrever um programa em C para fazer exatamente isso.
No entanto, presumo que você queira fazer isso apenas com as ferramentas já disponíveis. Na verdade, é possível fazer isso com dd
:
dd if=filename.gpg of=filename.gpg bs=49 skip=1 conv=notrunc
Isso pressupõe que o cabeçalho tenha 49 bytes. (YMMV)
Agora você precisa truncar o arquivo no comprimento correto. Existe um utilitário chamado truncate
GNU coreutils
que estará presente em muitos sistemas Unix. No entanto, você precisa saber o deslocamento de bytes do trailer. Isso pode ser feito com GNU grep
:
grep -b '^-----BEGIN PGP SIGNATURE-----' filename.gpg
Isso produzirá algo como:
104857600:-----BEGIN PGP SIGNATURE-----
A etapa final é usar esse valor com truncate
:
truncate -s 104857600 filename.gpg
No entanto, se você já sabe o comprimento do trailer, pode pular grep
e apenas dizer truncate
para encurtar o arquivo por esse número de bytes:
truncate -s -103 filename.gpg