
Если у меня есть подписанный двоичный файл размером 100 МБ, который я загружаю через интернет, мне нужно 200 МБ дискового пространства, чтобы открыть его. Файл просто подписан, а не зашифрован.
Когда места на диске мало, невозможно получить исходный файл, так как команда gpg не работает. Я увидел, что подписанный файл gpg — это исходный файл + несколько байт подписи в начале и в конце. Можно ли удалить эти байты из файла, не создавая новый файл, тем самым сэкономив место на диске? Подпись можно проверить с помощью:
# gpg --verify filename.gpg
без создания нового файла на диске. Пример рабочего процесса описан ниже:
# # 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
Если места на диске мало, команда gpg filename.gpg не выполнится.
решение1
Вы можете объединить процесс загрузки и проверку подписи в один конвейерный процесс следующим образом:
wget -qO- http://someaddress/filename.gpg|gpg >filename
решение2
Да, вы можете удалить байты с начала и конца, не занимая больше места на диске. Однако большинство утилит копируют файл в новый файл, удаляют старый, а затем переименовывают новый так, чтобы он был таким же, как старый. Я думаю, можно с уверенностью предположить, что он gpg
относится к этой категории. Конечно, это занимает вдвое больше места на диске, чем файл.
Что вам нужно сделать, это:
- На месте переместить байты файла «вниз» на размер заголовка PGP
- Установите длину файла, чтобы удалить трейлер PGP
При наличии подходящей утилиты это можно было бы сделать даже за один шаг, и можно было бы легко написать программу на языке C, которая бы это делала.
Однако я предполагаю, что вы хотите сделать это только с помощью уже имеющихся инструментов. На самом деле это возможно сделать с помощью dd
:
dd if=filename.gpg of=filename.gpg bs=49 skip=1 conv=notrunc
Это при условии, что длина заголовка составляет 49 байт. (YMMV)
Теперь вам нужно обрезать файл до нужной длины. Есть утилита, называемая truncate
в GNU coreutils
, которая будет присутствовать во многих системах Unix. Однако вам нужно знать смещение байта трейлера. Это можно сделать с помощью GNU grep
:
grep -b '^-----BEGIN PGP SIGNATURE-----' filename.gpg
Это выведет что-то вроде:
104857600:-----BEGIN PGP SIGNATURE-----
Последний шаг — использовать это значение с truncate
:
truncate -s 104857600 filename.gpg
Однако, если вы уже знаете длину трейлера, вы можете пропустить этот шаг grep
и просто указать truncate
, что нужно сократить файл на указанное количество байтов:
truncate -s -103 filename.gpg