インターネット経由でダウンロードした100MBの署名付きバイナリファイルがある場合、それを開くには200MBのディスク容量が必要です。ファイルは署名されているだけで、暗号化されていません。
ディスク容量が少ない場合、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
ディスク容量が少ない場合、gpgfilename.gpgコマンドは失敗します。
ダウンロードプロセスを組み合わせて、次のように1つのパイププロセスで署名を確認できます。
wget -qO- http://someaddress/filename.gpg|gpg >filename
はい、ディスク容量を増やすことなく、最初と最後からバイトを取り除くことができます。ただし、ほとんどのユーティリティは、ファイルを新しいファイルにコピーし、古いファイルを削除してから、新しいファイルの名前を古いファイルと同じに変更します。 gpg
がこのカテゴリに含まれると想定しても安全だと思います。もちろん、これはファイルに必要な2倍のディスク容量を使用します。
あなたがする必要があるのは:
適切なユーティリティがあれば、これを1つのステップで実行することも可能であり、これを実行する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