如何从签名文件中删除 gpg 签名而不在磁盘上创建新文件?

如何从签名文件中删除 gpg 签名而不在磁盘上创建新文件?

如果我有一个 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属于这一类。当然,这会占用文件所需磁盘空间的两倍。

你需要做的是:

  1. 将文件的字节“向下”移动 PGP 标头的大小
  2. 设置文件长度以删除 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

相关内容