如何使用Mercurial保存用户名和密码?


269

我在个人项目中使用了Mercurial,每次我想向服务器推送内容时都一直在输入用户名和密码。

我尝试将以下内容添加到.hgrc主目录中的文件中,但似乎被完全忽略了。

[ui]
username = MY_USER_NAME
password = MY_PASSWORD

如何正确地做到这一点?

Answers:


328

你可以让一个auth部分的.hgrcMercurial.ini文件,如下所示:

[auth]
bb.prefix = https://bitbucket.org/repo/path
bb.username = foo
bb.password = foo_passwd

“ bb”部分是一个任意标识符,用于将前缀与用户名和密码匹配-方便用于管理具有不同站点的不同用户名/密码组合(前缀)

您也只能指定用户名,然后在按下时仅需输入密码即可。

我也建议您看看钥匙圈扩展。由于它将密码存储在系统的钥匙圈中而不是纯文本文件中,因此更加安全。它与Windows上的TortoiseHg捆绑在一起,目前正在讨论将其作为捆绑的扩展分发到所有平台上。


3
当服务器为ssh:// HGSERVER时,为什么不能正常工作?在“SSH://用户名:密码@ HGSERVER”格式也不行..
奥伦

1
@Oren-查看以下注释-如果您使用的是SSH,为什么不使用基于密钥的登录?
David Eads 2010年

@santafebound正如其文字所说,它是“任意的”,仅用于将用户名和密码与前缀相关联,因此请提供对您有意义的任何标记。
克里斯·麦考利

我真的不建议以纯文本形式存储密码(这就是答案,即使它也简短地提到了一个更好的选择)。
Jasper

170

有三种方法可以执行此操作:使用.hgrc文件,使用ssh或使用密钥环扩展名


1.不安全的方式-更新〜/ .hgrc文件

适用于我的格式(在我的〜/ .hgrc文件中)是

[ui]
username=Chris McCauley <chris.mccauley@mydomain.com>

[auth]
repo.prefix = https://server/repo_path
repo.username = username
repo.password = password


您可以根据需要配置任意数量的回购协议,方法是在前缀之前添加一个三元组,前缀,用户名和密码。

这仅在Mercurial 1.3中有效,并且显然您的用户名和密码为纯文本格式-不好。


2.安全的方法-使用SSH来避免使用密码

Mercurial完全支持SSH,因此我们可以利用SSH无需密码即可登录服务器的功能 -您只需进行一次配置即可提供自生成的证书。到目前为止,这是做您想要的事的最安全的方法。


您可以在此处找到有关配置无密码登录的更多信息。


3.钥匙圈扩展

如果您想要一个安全的选项,但对SSH不熟悉,为什么不试试呢?

从文档...

该扩展程序在第一次拉入/从给定的远程存储库中拉入/推送时提示输入HTTP密码(就像默认情况下一样),但是将密码(由用户名和远程存储库URL组合键)保存在密码数据库中。在下一次运行时,它将检查.hg / hgrc中的用户名,然后在密码数据库中检查适当的密码,并使用这些凭据(如果找到)。

还有更详细的信息在这里


3
Satoru,克里斯不是在谈论汞,而是在谈论ssh:可以设置ssh,以便您不必使用密码来识别自己(如此处所述:debian-administration.org/articles/152)。
Tomislav Nakic-Alfirevic'4

4
方法2实际上是安全处理事务并维护远程系统上用户级别权限的唯一方法。
Peter Rowell

2
user570626使用密钥环集成的答案比这两个都好得多。@Peter Rowell:如果您有几个用户和存储库,那么ssh设置将是一个很大的麻烦;您需要本地的Unix用户,并且不得不限制.ssh / authorized_keys和Shell包装程序可以运行的命令。并非完全干净的解决方案。
Draemon

5
@Peter Rowell:1.这有什么区别?我说他的解决方案很快就会更好。2.它与托管环境无关,它纯粹是客户端(与您的SSH解决方案不同,它需要在服务器端进行更改以支持它)。3.关于巨魔和夸耀,我仍然说这不是一个干净的解决方案。您需要一个本地用户,并且必须授予他们外壳程序访问权限,然后对其进行限制。Shell访问并不总是明智的选择。令您感到惊讶的是,您经验丰富的人没有遇到不想授予您服务外壳访问权限的sysadmin。
Draemon

2
@德拉蒙:我想我们有不同的经历。就个人而言,我将无法在没有shell提示符的系统上工作。它使我完全依赖于其他系统已经安装了我需要的东西。我的一般经验是,如果无法获得提示,我几乎可以肯定无法获得我认为对我的工作流至关重要的其他服务。不同人的不同(按键)笔触。
彼得·罗威尔

65

没有人提到钥匙圈扩展。它将用户名和密码保存到系统密钥环中,这比如上所述将密码存储在静态文件中要安全得多。执行以下步骤,您应该一切顺利。我花了大约2分钟在Ubuntu上启动并运行它。

>> sudo apt-get install python-pip
>> sudo pip install keyring
>> sudo pip install mercurial_keyring

**Edit your .hgrc file to include the extension**
[extensions]
mercurial_keyring = 

https://www.mercurial-scm.org/wiki/KeyringExtension


1
这是我最喜欢的解决方案。...和刚@hadrien说什么,以后描述它的工作原理是在Mac OS X的魅力三项行动第二
ngeek

我也第二次@ngeek来支持我!
哈德里安

在Windows上,至少TortoiseHg支持密钥环扩展:全局设置->扩展-> mercurial_keyring
user272735 2011年

不幸的是,当前keyring扩展在Windows上存在一个错误,该错误一次只能保存一个密码。看到这个问题
劳伦斯·霍尔斯特

这似乎是最好的解决方案,但是当我尝试在OSX上使用它时,尝试从钥匙串中获取密码时会出现python segfaults。
艾萨克(Isaac)

30

一个简单的技巧是在项目.hg/hgrc文件的推送URL中添加用户名和密码:

[paths]
default = http://username:password@mydomain.com/myproject

(请注意,通过这种方式,密码以纯文本格式存储)

如果您正在同一域下的多个项目上工作,则可能需要在文件中添加重写规则~/.hgrc,以避免对所有项目重复此操作:

[rewrite]
http.//mydomain.com = http://username:password@mydomain.com

同样,由于密码以纯文本格式存储,因此我通常只存储我的用户名。

如果您在Gnome下工作,我将在此处解释如何集成Mercurial和Gnome Keyring:

http://aloiroberto.wordpress.com/2009/09/16/mercurial-gnome-keyring-integration/


但是我已经下载了扩展,当我试图做一个推密码提示拒绝让我过去:(可能是我已经做了我从来没有使用GNOME密钥环之前走错了路谢谢大家都是一样的。
satoru

您可能需要使用--debug和--verbose选项进行hg push,以查看发生了什么问题...
Roberto Aloi 2010年

非常适合手头的情况...如果您使用的是ssh,则无需输入密码...这就是密码的作用
beauXjames 2014年

假设您拥有一台设备的豪华性,那么您当然可以取消公钥。
大卫

23

上面的NOBODY向新手用户解释/阐明了术语。他们对条款感到困惑

.hg / hgrc-此文件用于存储库,位于本地/工作空间位置/实际存储库的.hg文件夹中。

〜/ .hgrc-此文件与下面的文件不同。该文件位于〜或主目录中。

myremote.xxxx = ..... bb.xxxx = ......

这是使用授权密钥环扩展名时[auth]节/指令下的行之一。确保您放置在此处的服务器名称与您在执行“ hg clone”时使用的服务器名称匹配,否则密钥环将显示“找不到用户”。bb或myremote是下面的行中的别名,是您在执行“ hg clone http:/.../../ repo1 bb或myremote”时必须提供的“别名”,否则它将无法正常工作,或者您必须确保本地仓库的.hg / hgrc文件包含相同的别名,即(您在进行hg clone ..时作为最后一个参数给出的别名)。

PS下面的链接提供了清晰的详细信息,对于快速编写语法感到抱歉。

例如:如果在〜/ .hgrc(Linux / Unix中的用户主目录)或Windows中用户主目录中的mercurial.ini包含以下行,并且

`"hg clone http://.../.../reponame myremote"`

,那么每个http repo链接都不会多次提示您输入用户凭据。在[/ extensions]下的〜/ .hgrc中,有一行“ mercurial_keyring =”或“ hgext.mercurial_keyring = /path/to/your/mercurial_keyring.py” ..其中应有一行。

[auth]
myremote.schemes = http https
myremote.prefix = thsusncdnvm99/hg
myremote.username = c123456

我试图找出如何设置PREFIX属性的方法,以便用户可以在没有用户名/密码提示的情况下克隆或执行任何汞操作,而不必担心他在http:// .... / ...中提到的内容使用汞回购链接时的服务器名称。它可以是IP,服务器名称或服务器的FQDN


4

使用MacPorts在Mac OSX上安装mercurial_keyring:

sudo port install py-keyring
sudo port install py-mercurial_keyring

将以下内容添加到〜/ .hgrc中:

# Add your username if you haven't already done so.
[ui]
username = email@address.com

[extensions]
mercurial_keyring =

运行这些命令并更新我的.hgrc文件后,我在TortoiseHg中得到“没有名为mercurial_keyring的模块”。
2015年

确保您具有正确的Python版本,如下所述:stackoverflow.com/questions/5173197/…–
phm

2

如果您使用的是TortoiseHg,则必须执行所附屏幕快照中所示的这三个步骤,这将为您正在使用的特定存储库添加凭据。

在此处输入图片说明

要添加全局设置,您可以访问文件C:\ users \ user.name \ mercurial.ini并添加该部分

[auth]
bb.prefix=https://bitbucket.org/zambezia/packagemanager
bb.username = $username
bb.password = $password

希望这可以帮助。


0

尽管在您的情况下它可能起作用也可能不起作用,但我发现使用Putty的Pageant生成公共/私有密钥很有用。

如果您还使用bitbucket(.org),它应该使您能够为用户帐户提供公钥,然后自动保护到达存储库的命令。

如果Pageant在重启后没有为您启动,则可以将Pageant的快捷方式添加到Windows的“开始”菜单中,并且该快捷方式可能需要在“属性”中填充您的私有(.ppk)文件的位置。

通过此操作,需要将Mercurial和您的本地存储库设置为使用SSH格式进行推/拉。

这是Atlassian的Windows或Mac / Linux网站上的一些详细说明。

您不必相信我的话,毫无疑问,还有其他方法可以做到。也许这里描述的这些步骤更适合您:

  1. 从开始-> PuTTY-> PuttyGen启动PuttyGen
  2. 生成一个新密钥并将其另存为.ppk文件而无需密码
  3. 使用Putty登录要连接的服务器
  4. 将PuttyGen中的公钥文本追加到〜/ .ssh / authorized_keys的文本中
  5. 创建一个.ppk文件的快捷方式,从开始-> Putty到开始->启动
  6. 从“启动”菜单中选择.ppk快捷方式(这将在每次启动时自动发生)
  7. 看到系统托盘中的Pageant图标吗?右键单击它,然后选择“新会话”
  8. 在“主机名”字段中输入username @ hostname
  9. 您现在将自动登录。

0

使用密匙环扩展名。将下面的条目添加到mercurial.ini文件。

[扩展名] mercurial_keyring =

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.