2

Если у меня есть бинарный файл со знаком 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 <example@example.com>"
# ls
filename filename.gpg
# du -ch *
100M filename
100M filename.gpg
200M total
# rm filename.gpg

Когда места на диске мало, команда gpg filename.gpg не будет выполнена.

2 ответа2

2

Вы можете объединить процесс загрузки и проверить подпись в одном конвейерном процессе следующим образом:

wget -qO- http://someaddress/filename.gpg|gpg >filename
1

Да, вы можете удалять байты с начала и до конца, не занимая больше места на диске. Однако большинство утилит копируют файл в новый файл, удаляют старый, а затем переименовывают новый, чтобы он совпадал со старым. Я думаю, можно с уверенностью предположить, что gpg находится в этой категории. Это, конечно, использует удвоенное дисковое пространство, необходимое для файла.

Что вам нужно сделать, это:

  1. На месте переместить байты файла "вниз" на размер заголовка PGP
  2. Установите длину файла, чтобы удалить трейлер PGP

С правильной утилитой можно было бы сделать это за один шаг, и можно было бы легко написать программу на C, чтобы сделать это.

Тем не менее, я предполагаю, что вы хотите сделать это только с помощью уже доступных инструментов. На самом деле это можно сделать с помощью dd:

dd if=filename.gpg of=filename.gpg bs=49 skip=1 conv=notrunc

Это при условии, что заголовок имеет длину 49 байтов. (YMMV)

Теперь вам нужно обрезать файл до правильной длины. В GNU truncate есть утилита 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .