如果我有一个 100 MB 的签名二进制文件,我从网上下载,则需要 200 MB 的磁盘空间才能打开它。该文件只是签名的,而不是加密的。
当磁盘空间不足时,无法获取原始文件,因为 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)
现在您需要将文件截断为正确的长度。GNUtruncate
中有一个名为 的实用程序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