
Si tengo un archivo binario firmado de 100 MB que descargo de Internet, necesito 200 MB de espacio en disco para abrirlo. El archivo simplemente está firmado, no cifrado.
Cuando hay poco espacio en el disco, no es posible obtener el archivo original porque falla el comando gpg. Vi que el archivo gpg firmado es el archivo original + algunos bytes de firma al principio y al final. ¿Es posible eliminar estos bytes del archivo sin crear un archivo nuevo, ahorrando así espacio en el disco? La firma se puede verificar usando:
# gpg --verify filename.gpg
sin crear un nuevo archivo en el disco. A continuación se describe un flujo de trabajo de muestra:
# # 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
Cuando el espacio en disco es bajo, el comando gpg filename.gpg fallará.
Respuesta1
Puede combinar el proceso de descarga y verificar la firma en un proceso canalizado como este:
wget -qO- http://someaddress/filename.gpg|gpg >filename
Respuesta2
Sí, puede eliminar bytes desde el principio y el final sin utilizar más espacio en disco. Sin embargo, la mayoría de las utilidades copiarán el archivo a un archivo nuevo, eliminarán el antiguo y luego cambiarán el nombre del nuevo para que sea el mismo que el anterior. Creo que es seguro asumir gpg
que está en esta categoría. Por supuesto, esto utiliza el doble del espacio en disco que necesita el archivo.
Lo que debes hacer es:
- In situ mueve los bytes del archivo "hacia abajo" según el tamaño del encabezado PGP
- Establezca la longitud del archivo para eliminar el avance de PGP
Con la utilidad adecuada, incluso sería posible hacer esto en un solo paso, y se podría escribir fácilmente un programa en C para hacer precisamente esto.
Sin embargo, supongo que quieres hacerlo sólo con las herramientas que ya están disponibles. De hecho, es posible hacer esto con dd
:
dd if=filename.gpg of=filename.gpg bs=49 skip=1 conv=notrunc
Esto supone que el encabezado tiene 49 bytes de longitud. (MMV)
Ahora necesitas truncar el archivo a la longitud correcta. Hay una utilidad llamada truncate
GNU coreutils
que estará presente en muchos sistemas Unix. Sin embargo, necesita conocer el desplazamiento de bytes del avance. Esto se puede hacer con GNU grep
:
grep -b '^-----BEGIN PGP SIGNATURE-----' filename.gpg
Esto generará algo como:
104857600:-----BEGIN PGP SIGNATURE-----
El último paso es utilizar este valor con truncate
:
truncate -s 104857600 filename.gpg
Sin embargo, si ya conoce la longitud del avance, puede omitirlo grep
y simplemente decirle truncate
que acorte el archivo en esa cantidad de bytes:
truncate -s -103 filename.gpg