我正在尝试编写并行压缩/加密备份脚本以进行存档 使用GNU parallel,xz和GnuPG。脚本的核心部分是:
tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . \
| parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 | gpg --encrypt --recipient $RECIPIENT" \
| pv > $TARGET/$FILENAME
没有GnuPG加密,它运行良好(解压缩和解压缩工作), 但是在添加并行加密后,它无法解密并出现以下错误:
[don't know]: invalid packet (ctb=0a)
gpg: WARNING: encrypted message has been manipulated!
gpg: decrypt_message failed: Unexpected error
: Truncated tar archive
tar: Error exit delayed from previous errors.
由于未压缩的大小与gnu parallel的块大小(大约125M)相同,我认为它与GnuPG支持部分块加密有关。我该如何解决这个问题?
FYI
关于随机数生成的另一个并行gpg加密问题
https://unix.stackexchange.com/questions/105059/parallel-pausing-and-resuming
答案 0 :(得分:3)
GnuPG不支持连接多个加密流并立即对其进行解密。您必须存储多个文件,并单独解密它们。如果我没有弄错,你的命令甚至会混淆GnuPG的所有并行实例的输出,因此结果或多或少是随机垃圾。
无论如何:GnuPG也负责压缩,看看--compression-algo
选项。如果您更喜欢使用xz
,请应用--compression-algo none
,以便GnuPG不会尝试再次压缩已经压缩的邮件。加密受到CPU指令的大量支持,xz -9
实际上可能比加密更耗时(尽管我没有对此进行基准测试)。
答案 1 :(得分:3)
包
tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . |
parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 | gpg --encrypt --recipient $RECIPIENT;echo bLoCk EnD" |
pv > $TARGET/$FILENAME
打开包装
cat $TARGET/$FILENAME |
parallel --pipe --recend 'bLoCk EnD\n' -N1 --keep-order --rrs 'gpg --decrypt | xz -d' |
tar tv
确保我们一次传递一条记录需要 -N1
。 GnuPG不支持解密多个合并记录。
答案 2 :(得分:0)
这主要是一个gpg问题。 gpg不支持多线程 永不。你可以在网上搜索原因。
使用gpg v2它甚至变得更糟:你甚至无法运行多个gpg v2实例 并行,因为他们都锁定了gpg-agent,现在正在做所有的事情 工作........也许我们应该在进行大规模加密时寻找替代方案。
https://answers.launchpad.net/duplicity/+question/296122
编辑:不可以。可以同时运行多个gpg v2实例,gpg-agent没有任何问题。