尽管设置允许存储密码,但SVN无法存储密码

45

我按照书上的指示做了一切,即从.subversion/auth中删除了身份验证文件,并明确将相关配置参数设置为'yes',尽管这是默认的,但每次使用shell SVN命令时都会要求输入密码。仓库位于cvsdude.com上,客户端运行Linux操作系统。 我还使用缓存密码良好的Subclipse插件。

我模糊地记得当我开始使用它时,该命令会交互地问我是否要保存明文密码,而我选择了不保存。这个选择能否被存储在某个地方,并优先于配置文件?


1
你是在运行桌面环境(GNOME、KDE等)或者通过ssh登录到机器时运行svn吗? - ZoogieZork
3
你是不是使用 svn+ssh:// 登录? - Sander Rijken
1
另外,我们能否查看您的~/.subversion/config~/.subversion/servers文件内容? 只需要从config中的[auth]部分和servers中的[global]即可。 - ZoogieZork
感谢您的评论,我找到了问题所在 - 它是服务器文件中的设置(不要存储明文密码)。我想知道为什么配置文件中有“[auth]”部分的冗余。此外,在讨论存储密码时,该书没有提到它。再次感谢! - davka
2
在配置文件中,有这样一行注释:### 此文件中此部分的其余内容已被弃用。

'store-passwords' 和 'store-auth-creds' 现在都可以在您的配置目录下的 'servers' 文件中指定。

在此部分中指定的任何内容都将被 'servers' 文件中指定的设置覆盖。

- Hoàng Long
24个回答

50

最近版本的Subversion(~ 1.8)允许您通过$HOME/.subversion/servers配置密码缓存:

[global]
store-passwords = yes
store-plaintext-passwords = yes

但是,根据您的系统设置,这可能还不够。如果不够,请确保$HOME/.subversion/config包含以下内容:

[auth]
password-stores =

这意味着变量 password-stores 明确设置为空字符串(背景是svn现在包含对一些关键代理工具的支持 - 而与默认配置的工具接口可能很脆弱 - 导致忽略上述选项和非缓存行为而不发出警告)。
第一次使用 svn 时,层次结构 $HOME/.subversion 将在第一次 svn 操作后创建 - 例如在执行第一个 checkout 时。然后,Subversion 创建了提到的文件并用最重要的选项进行注释,包括一些文档。
因此,将旧的 $HOME/.subversion 目录移开也是有意义的,以便有良好定义的起点。
另一个陷阱是权限 - 即在 $HOME/.subversion 下不可读的文件 - 但这通常不是问题,因为当 svn 创建它们时,它会处理正确的权限(例如,auth 目录仅由用户可读,而不是群组/所有人,独立于配置的 umask)。

1
请注意,password-stores = 行必须放在 [auth] 部分中。 - Thomas Leonard
@ThomasLeonard,是的,已将部分标题添加到配置片段中。 - maxschlepzig
4
+1 关于“密码存储”的提示拯救了我的一天。谢谢! :) - hochl
这两个文件不是我创建的,我必须按照你的要求创建并填写它们($HOME/.subversion/config$HOME/.subversion/servers)。对我来说很管用(Oxygen 3 - Mars 2018),非常感谢我的朋友! - Nico
我想进一步说,在最近的Subversion版本中,你必须在“servers”文件中指定store-passwords和store-plaintext-passwords。虽然它们在“config”文件中显示为选项,但即使我在那里设置它们,它们也不会被保留(在“servers”文件中没有明确的内容)。[注意,这是在一个旧的Windows 2008服务器上;您的情况可能有所不同] - Wolske
28
需要翻译的内容如下:我认为需要注意的是,自 SVN 1.12 版本以来,在编译时纯文本存储已被默认禁用(如果您想使用此功能,必须重新编译 SVN),因此现在一个空白的 password-stores = 行将不再起作用(例如,您需要启动一个 gpg-agent --daemon 进程并配置 SVN,如 password-stores = gpg-agent)。请参阅 https://subversion.apache.org/docs/release-notes/1.12#client-server-improvements "On Unix-like systems, client-side storage of passwords in plaintext on disk is now disabled by default at compile-time."。 - SRG

37

Veni

我相信我尝试了一切:

  • 检查服务器配置
  • 检查~/.subversion权限,全部为600
  • 检查~/.subversion/config文件
    • store-plaintext-passwords = yes
    • store-passwords = yes
    • store-auth-creds = yes
      • 以上两者在[global][groups]部分中都进行了设置
  • 检查~/.subversion/servers文件
    • 与上述相同

对于所有的配置文件,我验证了所有的部分,并输入了一个错误参数来验证svn客户端停止工作(所以,配置文件已经被读取)。

  • 删除并重新创建了~/.subversion/auth目录

检查$HOME/.subversion/config中的客户端配置是否禁用了密码存储:

[auth]
### Set password stores used by Subversion. They should be
### delimited by spaces or commas. The order of values determines
### the order in which password stores are used.
# password-stores = gpg-agent,gnome-keyring,kwallet
### To disable all password stores, use an empty list:
password-stores =
### Both 'store-passwords' and 'store-auth-creds' can now be
### specified in the 'servers' file in your config directory
### and are documented there. Anything specified in this section
### is overridden by settings specified in the 'servers' file.
store-passwords = yes    # just in case
store-auth-creds = yes   # just in case

什么都没用。

Vidi

然后我阅读了精细的手册。一切都很好: 你不必能够做到这一点。“在Unix系统上,默认情况下禁止将密码以明文形式存储在磁盘上”。

Vici

幸运的是,读取密码的部分仍然存在于客户端二进制文件中。因此,如果密码恰好被存储了,它将起作用。我正在运行SVN 1.13:

svn, version 1.13.0 (r1867053)
   compiled Mar 24 2020, 12:33:36 on x86_64-pc-linux-gnu

所以我打开了刚刚在~/.subversion/auth/svn.simple目录中创建的文件(它可能包含多个文件,你可能需要检查它们以找到你想要的领域),并找到了以下内容:
K 15
svn:realmstring
V 37
<svn://home.sweet.home:3690> Profekto
K 8
username
V 6
lserni
END

语法很简单:首先是键"K",后面跟着键的长度,接着是值"V",再后面是值的长度。
在文件的顶部,我手动添加了八行提供明文密码的内容。
K 8
passtype
V 6
simple
K 8
password
V 20
NotTheActualPassword

(注意:在最新的Ubuntu上,默认情况下passtype是gpg-agent,所以我的密码会被覆盖。因此,我必须将“K 9 V gpg-agent”更改为“K 6 V simple”。你可能不相信这个 - 当我观察到这种行为时,我可能犯了一些错误 - 但如果文件中没有“K 8 passtype”,你必须在用户名和密码之前添加它,否则它将无法工作)。
现在它可以正常工作了。

创建文件使我下定了决心。 - Lance
1
这对我有用,RabbitVCS为我创建了这个文件,并按照答案中提到的方式存储了密码。 - Kainix
3
以防其他人和我一样遇到同样的问题 :-) 在你的密码前面的V<number>中的数字必须是你密码中字符的数量。是的,LSerni已经说过了,但我第一次看的时候也错过了这个细节。 - Duke Robillard
2
@LSerni:我可以确认这也适用于svn版本1.14.1(r1886195)。 - wolfrevo
1
@LSerni:我建议您更新您的答案,并提到在~/.subversion/auth/svn.simple中可能会有多个文件。 - wolfrevo
1
@wolfrevo 好主意。完成了。 - LSerni

17
自从 SVN 1.12 版本(2019年4月)开始,基本上就无法直接存储明文密码了。从发行说明中可以看到:

在类 Unix 系统中,默认情况下禁用客户端明文密码存储,建议使用基于 Gnome Keyring、Kwallet 或 GPG-Agent 的密码缓存机制。

这个变更不影响 Windows 和 Mac OS 平台,因为它们一直以来都使用加密格式存储密码。

所以... 除非你自己编译了 SVN 客户端,否则你现在很可能有一个不允许存储明文密码的版本。

顺便说一下,之前能够正常工作的明文密码在升级 Subversion 后甚至可能停止工作。

如果你不介意每次会话都输入密码,使用 gpg-agent 相当简单。只需运行 gpg-agent --daemon,然后运行 svn 命令输入密码,下一个命令将不再需要它。


1
天啊...我刚输入完这个答案,就看到了@SRG的评论,基本上是同样的信息。我会把我的答案保留在这里,因为大多数人不会在评论中寻找实际的答案(我也没有)。不过,大多数人也不会往下滚动到低评分的答案... - caxcaxcoatl
对于社区来说,最好的事情是让@maxschlepzig(最高分)和@davka(被采纳的答案)都更新以反映新信息。我不会编辑它们,因为那会改变答案的本意,最好让原作者自己来做。 - caxcaxcoatl

10

如果有助于未来某个人,我希望提交详细的答案。

Subversion 1.6及更高版本默认会缓存您的用户名和密码,但除非您通过命令行或更改Subversion配置明确允许,否则它不会以明文方式缓存密码。

如果您使用--username和--password选项签出了工作副本,则会看到以下消息:

-----------------------------------------------------------------------
ATTENTION! Your password for authentication realm:

<https://subversion.assembla.com:443> Assembla Restricted Area

can only be stored to disk unencrypted! You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible. See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'~/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? 

正如消息中提到的那样,如果您输入“是”,Subversion才会保存未加密的密码。 如果这样做,您将来执行svn命令时无需添加--username或--password选项。

但是,如果您不希望看到此提示,您可以通过更改本地计算机上名为“server”的配置文件来更改Subversion客户端的全局配置。 它存储在这里:

~/.subversion/server
您需要将以下行添加到“服务器”文件中:
[global]
store-plaintext-passwords = yes

随着这个改变,您只需要使用 --username 和 --password 选项执行一次 svn 命令。然后,Subversion 将自动保存您的凭据,而不会出现上述提示。

有关禁用此警告并在纯文本中缓存密码的更多信息,请参阅Subversion 1.6 安全改进 博客文章。


9

我遇到了同样的问题,认为我在.subversion/servers和.subversion/config中设置了所有适当的配置,尝试删除.subversion/auth等,但都没有成功。

最终我通过移动.subversion目录(或删除它也可以)并运行svn co来保存凭据。我收到了以下消息:

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <http://sweeney:80> Subversion repository

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/home/davids/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? 

我输入了“yes”,然后得到了同样的消息。我顽固地再次输入了“yes”。现在我的密码似乎已经保存了。

有点出乎意料的是,在.subversion中查看配置时,没有一个设置被取消注释;它们都设置为默认值,因此我想未来要为不同的服务器保存密码,我需要两次回答这个警告。

希望这可以帮到你。


谢谢。请看我在问题上的评论——我在其中一个配置文件中找到了解决方案。 - davka
谢谢,这也帮助了我。(我之前所有的设置都是正确的,但没有成功。) - TondaCZE

7
我认为我在这里找到了一个有用的提示:http://svn.haxx.se/users/archive-2013-07/0094.shtml 据我所知,客户端忘记检查“gpg-agent”是否正在运行。
它默认将“passtype”=“gpg-agent”插入到~/.subversion/auth/svn.simple/缓存文件中。
那是个错误!
解决方法是(并且为了避免手动更改 ~./subversion/auth/svn.simple/ 中的密码缓存文件),删除这些文件(但要保存备份)。
将以下行添加到~/.subversion/config ([auth] 部分):
password-stores=
< p >(请考虑:空值!这可以防止客户选择任何错误的东西并假设“简单”。)< /p > < p >现在例如尝试一个:< /p >
svn up

Subversion现在会警告您保存纯文本密码。

如果您对此没有问题,请输入“是”,一切都没问题了。

之后,Subversion将为特定服务器创建缓存文件,然后您可以再次删除“password-stores”的条目。


6

删除旧的存储密码,例如rm ~/.subversion/auth/svn.simple/*。我尝试了所有其他建议,这是对我有效的方法。


6

无论我做了什么都没有用。我检查了所有可能的选项、配置文件以及谷歌上关于这个问题的数百页。最终,我放弃了,并将这个命令添加到了我的 .bashrc 文件中。

alias svn='svn --password <mypassword>'

5
感谢您的评论,我找到了问题所在——服务器文件中的设置(不要存储明文密码)。我想知道为什么配置文件的[auth]部分会存在这种冗余。在谈论存储密码时,SVN 书籍也没有提到这一点。

2
我需要对服务器文件进行两个更改: #密码/密码短语缓存参数: store-passwords = 是 store-plaintext-passwords = 是 - sleep-er
1
在配置文件中,有这样一行注释:### 此文件中此部分的其余内容已被弃用。### 现在可以在配置目录下的'servers'文件中指定'store-passwords'和'store-auth-creds'。### 在此部分中指定的任何内容都将被'servers'文件中指定的设置所覆盖。 - Hoàng Long
在Subversion 1.12中,默认情况下禁用了Subversion客户端对明文密码的缓存。 - rmflow

3

我需要对服务器文件进行两处更改才能使其对我起作用

# Password / passphrase caching parameters:
store-passwords = yes
store-plaintext-passwords = yes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接