我正在设置从本地计算机到远程服务器的备份。
我在本地计算机上生成了 gpg 密钥,并使用以下命令运行了测试备份:
PASSPHRASE="MyGPGPassphrase" duplicity --encrypt-key KeyID test scp://user@server/path
备份似乎工作正常,在服务器上创建了三个文件。
我的问题是无法恢复。
我删除了本地计算机上的测试文件,并尝试使用以下命令恢复它:
PASSPHRASE="MyGPGPassphrase" duplicity --encrypt-key KeyID scp://user@server/path test
我收到以下错误:
Synchronizing remote metadata to local cache...
Copying duplicity-full-signatures.20151011T011134Z.sigtar.gpg to local cache.
GPGError: GPG Failed, see log below:
===== Begin GnuPG log =====
gpg: encrypted with 2048-bit RSA key, ID KeyID(of ssb), created 2015-10-11
"Name <email>"
gpg: public key decryption failed: Inappropriate ioctl for device
gpg: decryption failed: No secret key
===== End GnuPG log =====
我使用以下命令在本地机器上导出 gpg 密钥:
gpg --export-secret-key KeyID > secret.key
gpg --armor --export KeyID > public.key
并使用以下命令将其导入服务器:
gpg --import secret.key
gpg --import public.key
为了使恢复工作顺利进行,还需要做什么吗?
编辑:
如果我在没有 PASSPHRASE 环境的情况下执行命令,则duplicity --encrypt-key Key D test scp://user@host/path
无论如何都会创建备份而无需输入密码。
输出file duplicity-full.20151011T115714Z.vol1.difftar.gpg
列出了与 --encrypt-key 中指定的不同的 KeyID。我的密钥环中没有列出的密钥。
答案1
问题在于,就像链接的帖子所述,gpg 2.1 从管道中撤回了密钥认证的密码。
需要启用和配置 gpg 代理才能使恢复正常工作。
添加以下内容~/.gnupg/gpg.conf
:
use-agent
pinentry-mode loopback
并致您的~/.gnupg/gpg-agent.conf
:
pinentry-program /usr/bin/pinentry-gtk-2
allow-loopback-pinentry
然后使用 重新启动代理echo RELOADAGENT | gpg-connect-agent
。
即使密钥仅在本地机器上,恢复仍可进行。不过,我还是不明白为什么在进行增量恢复时不要求输入密码。
答案2
sudo
我在使用执行时遇到过这个问题duplicity
,它使它在 的主目录中搜索私钥root
。没有找到私钥,出现“无密钥”错误,至少对我来说,我并不清楚原因。
解决此问题最简单的方法是避免使用sudo
,就我而言,是通过在目标目录上设置正确的权限。
如果sudo
必须,则需要设置适当的 GPG 选项,以便它使用用户的 GPG 钥匙串:添加--gpg-options "~user/.gnupg"
到 duplicity 命令中,如下所示在这个答案中说明
也许这对其他人有帮助:-)
答案3
您使用的是 gpg 2.1 吗?如果是,如果您想通过 env var 传递密码,duplicity 和 gpg 需要一些额外的参数。
https://lists.launchpad.net/duplicity-team/msg02653.html
或者,干脆不设置密码,gpg-agent 就会询问您并为您记住密码。