18

我在 Debian Stretch 机器上使用 Subversion 客户端(版本 1.9.5 r1770682,从默认软件包存储库安装),我只有 SSH 访问权限。我正在通过 HTTPS 连接到 Subversion 存储库,并且希望避免每次执行svn uporsvn ci命令时都必须重新输入密码。我还想避免将密码作为明文存储在磁盘上。

SVN Book建议我应该能够使用 GPG-Agent 作为缓存密码的一种方式。尽管svn --version报告说 GPG-Agent 身份验证凭据缓存应该可用,但我在让它工作时遇到了一些麻烦。

关于 GPG,我创建了一个 GPG 密钥对,已添加export GPG_TTY=$(tty)到我的.profile文件中,并通过加密和解密一段文本验证了 GPG 的工作原理。

关于 Subversion,在我的.subversion/config文件中,我设置了以下内容:

$ grep '^[^#]' < .subversion/config
[auth]
password-stores = gpg-agent
[helpers]
[tunnels]
[miscellany]
[auto-props]
[working-copy]

在我的.subversion/servers文件中,我设置了以下内容:

$ grep '^[^#]' < .subversion/servers
[groups]
[global]
store-passwords = yes
store-plaintext-passwords = no

但是,当我执行svn命令时,不会缓存任何密码。有没有人对我可能做错了什么有任何建议?有没有人成功使用 GPG-Agent 来缓存 HTTPS 密码?(也许这个凭证缓存仅适用于 SVN+SSH 连接?)

任何帮助将不胜感激。

4

2 回答 2

26

从上面罗马的建议开始,我终于通过再次研究找到了解决问题的方法。find_gpg_agent_socketSubversion客户端的GPG-Agent认证源码中函数的注释确实说明了:

$GPG_AGENT_INFO优先,如果设置,否则$GNUPGHOME将被使用。

(...)

供参考GPG_AGENT_INFO包括 3 : 分隔字段。套接字的路径、gpg-agent 进程的 pid 以及代理所使用的协议的版本。

gpgconf --list-dirs agent-socket通过命令行调用可以很容易地找到 GPG-Agent 套接字的路径。Subversion 客户端不使用变量的其他两个部分,$GPG_AGENT_INFO因此不必设置。

因此,我在.profile文件末尾添加了以下代码:

export GPG_TTY=$(tty)
export GPG_AGENT_INFO=`gpgconf --list-dirs agent-socket | tr -d '\n' && echo -n ::`

这会将$GPG_TTY变量设置为当前终端,并将$GPG_AGENT_INFO变量设置为 GPG-Agent 套接字,后跟两个冒号字符(即 Subversion 源代码所期望的格式)。

Subversion 似乎将存储库的身份验证设置缓存在~/.subversion/auth,因此我发现有必要在正确使用 GPG-Agent 之前清除该目录:

rm -rf ~/.subversion/auth

开始新会话后,您应该能够验证$GPG_AGENT_INFO变量是否设置正确:echo $GPG_AGENT_INFO应该输出类似/run/user/1000/gnupg/S.gpg-agent::1000当前用户的 uid 在哪里)。

例如svn up,在执行 Subversion 命令时,将首次提示您的密码:

Updating '.':
Enter your Subversion password for <https://example.com:443> Subversion Repository
Password for 'username': :
At revision 123.

当一段时间后对同一个存储库执行第二个 Subversion 命令时,Subversion 应该使用 GPG-Agent 缓存的密码:

Updating '.':
At revision 123.

编辑:我的印象是,一次使用存储库时(即,当它还没有出现在 Subversion 的缓存中时),密码只有在输入两次后才能被 GPG-Agent 正确保存。

于 2019-08-20T17:44:39.800 回答
2

该线程似乎给出了提示:https ://groups.google.com/forum/#!topic/subversion_users/WS8Cr7mAovQ

我在 Ubuntu 上运行 Xfce,我遇到了同样的问题。显然,原因是$GPG_AGENT_INFO没有设置环境变量。手动运行 /etc/X11/Xsession.d/90gpg-agent 脚本(设置此变量)确实帮助了我。

于 2019-08-09T18:35:58.633 回答