如何在同一系统中使用多个SSH密钥维护多个Bitbucket账户

79

我有多个Git账户,一个用于个人使用,另一个用于公司使用。这两个账户的源需要从我的笔记本电脑上激活。 我生成了两个ssh密钥,例如id_rsa.pub和id_benwork_rsa.pub, 并且我配置了Git的config如下:


Host sfsworkdid
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa
Host workdid
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_benwork_rsa

所以我的问题是:在向任何仓库推送时,git 都会要求第一个 ssh_key 的密码。 每次我更改 git config 中的 user.name 为 git config user.name "mybitbucketusername"。 请告诉我如何在同一系统中使用多个 git 帐户和多个 ssh 密钥

我尝试了如何使用多个 ssh 密钥多个 bitbucket 帐户,但没有用

在 github / bitbucket 上使用多个帐户/多个身份进行推送对到目前为止有些有帮助


user.name与您的Bitbucket帐户无关。根据Git文档:“user.name:要记录在任何新创建的提交中的全名。可以被GIT_AUTHOR_NAME和GIT_COMMITTER_NAME环境变量覆盖。请参见git-commit-tree(1)。”您的问题是什么,您想实现什么目标? - Attila Szeremi
你有检查过这个吗?https://gist.github.com/jexchan/2351996 - chepukha
你能否请在你的项目中添加“.git/config”文件,当然需要将你的用户名和项目名替换为“USERNAME”和“PROJECT”。 - Tzook Bar Noy
可能是为给定域指定git push的SSH密钥的重复问题。 - Tobia Tesan
1
你必须更改远程URL,包括你的别名名称,而不是'bitbucket.org'。 - kool79
  1. 不要修改 user.name。它不用于授权,仅用于 Git 历史记录。
  2. 您必须更改远程 URL,将别名名称(sfsworkdid 或 workdid)包含在其中,而不是使用“bitbucket.org”。即将“git@bitbucket.org:my-group/my-repo.git”更改为“git@sfsworkid:my-group/my-repo.git”或“git@workid:my-group/my-repo.git”。这样,SSH 就会知道应该使用哪个配置。使用“git@bitbucket.org”,SSH 将使用默认身份验证(id_rsa.pub)。
- kool79
9个回答

116

为Mac OSX、GitBash和Linux创建多个身份

此时,您应该已经至少创建了一个默认身份。要查看是否已经有默认身份,请列出您的.ssh目录的内容。默认身份文件显示为id_encrypt和id_encrypt.pub对。加密值为rsa或dsa。使用ssh-keygen命令创建新身份。在下面的示例中,身份名称为personalid。

$ ssh-keygen -f ~/.ssh/personalid -C "personalid"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/manthony/.ssh/personalid.
Your public key has been saved in /Users/manthony/.ssh/personalid.pub.
The key fingerprint is:
7a:9c:b2:9c:8e:4e:f4:af:de:70:77:b9:52:fd:44:97 personalid
The key's randomart image is:
+--[ RSA 2048]----+
|         |
|         |
|        .|
|        Eo|
|  .  S  . ..|
|  . . o . ... .|
|  . = = ..o o |
|  . o X ... . .|
|  .ooB.o ..  |
+-----------------+

如果您有多个Bitbucket账户,需要为每个账户生成一个新的公/私钥对。

创建SSH配置文件

当您拥有多个身份文件时,可以创建SSH配置文件机制来为您的各种身份创建别名。您可以使用许多参数和不同的方法构造SSH配置文件。本示例中使用的别名条目格式为:

Host alias
HostName bitbucket.org
IdentityFile ~/.ssh/identity

要为两个身份(工作身份和个人身份)创建配置文件,请按照以下步骤进行:

  1. 打开终端窗口。

  2. 编辑 ~/.ssh/config 文件。如果没有配置文件,请创建一个。

  3. 为每个身份组合添加别名,例如:

  4. Host workid
     HostName bitbucket.org
     IdentityFile ~/.ssh/workid
    Host personalid
     HostName bitbucket.org
     IdentityFile ~/.ssh/personalid
    
  5. 关闭并保存文件。

现在,您可以将别名替换为存储库URL地址的部分,如下所示: git@bitbucket.org:accountname/reponame.git -> git@alias:accountname/reponame.git

将每个密钥加载到适当的Bitbucket帐户中

enter image description here

确保ssh-agent正在运行并已加载您的密钥

enter image description here

使用SSH和您的别名配置克隆存储库

要使用您配置的多个SSH标识符之一克隆存储库,请在SSH URL中使用您的别名克隆该存储库。要尝试此操作,请登录Bitbucket并执行以下操作:

  1. 导航到存储库概述。
  2. 显示SSH URL。
    例如,SSH URL为:
    git@bitbucket.org:accountname/reponame.git
    然后使用以下命令克隆存储库:
    git clone git@personalid:accountname/reponame.git

这是官方解决方案“为GitBash、Mac OSX和Linux配置多个SSH标识符”,我用得很好!


作为 .ssh/config 的补充,我必须添加 "IdentitiesOnly yes",否则会尝试使用我的默认 id_rsa 在 bitbucket 上进行登录并失败,因为它与另一个现有帐户(在 bitbucket 上)相关联,该帐户用于登录。 - David Bernard
1
对我来说最有效的方法是使用以下方式,例如,将ssh URL作为: git@bitbucket.org:accountname/reponame.git 然后使用以下命令克隆存储库: git clone git@personalid:accountname/reponame.git - Sunil Kumar
1
非常好用!如果您已经有一个存储库,只需编辑.git/config,将bitbucket.org域替换为alias,然后就可以开始使用了。在[remote "origin"] => url = git@<alias>:<account>/<reponame>.git - luis19mx
2
这个该死的东西运行得非常完美,谢谢! - alanko
这只是 @SudarP 的答案中缺少了 User yourusername。一旦我添加了它 - 它就开始工作了。 - marcinsdance
显示剩余3条评论

22

请按照以下方式编辑您的~/.ssh/config文件!

Host bitbucket.org-yourusername
    HostName bitbucket.org
    User yourusername
    IdentityFile ~/.ssh/yoursshkey
    IdentitiesOnly yes
将你的远程 git url 更改为在 '@bitbucket.org' 之前加上你的用户名。
git remote add origin yourusername@bitbucket.org:company/app.git
或者
git remote set-url origin yourusername@bitbucket.org:company/app.git    

如果您还没有克隆您的存储库:

git clone yourusername@bitbucket.org:company/app.git

2
这对我有用,但需要稍作修改 - Host字段在两种情况下必须相同,例如Host bitbucket.org而不是Host bitbucket.org-yourusername - wal

11

除了上面提到的 ~/.ssh/config 方法外,另一种方法是在克隆命令本身中指定配置变量 core.sshCommand。例如,

git clone --config core.sshCommand='ssh -i/home/username/.ssh/id_ed25519' git@bitbucket.org:the_best/awesome_repo.git

这将设置本地存储库的配置值,并使后续的push/pull命令“正常工作”。

$ git config --local --get core.sshCommand
ssh -i/home/username/.ssh/id_ed25519

此功能支持 git 2.10 及更高版本。


这是2019/06在我的Ubuntu客户端上唯一可行的解决方案。 - jens.klose

9

在网络和社区的帮助下,我找到了如何在我的Mac - MacOS Monterey上配置2个不同的Bitbucket账户。

假设您有2个Bitbucket帐户,用户名分别为username1和username12。

  1. 打开终端并为两个用户名创建2个ssh文件:

ssh-keygen -f ~/.ssh/username1-Bitbucket

ssh-keygen -f ~/.ssh/username2-Bitbucket

  1. 启动ssh-agent:

eval $(ssh-agent)

  1. 创建或编辑~/.ssh/config文件:

创建:

touch ~/.ssh/config

open ~/.ssh/config

编辑:

open ~/.ssh/config

~/.ssh/config文件应如下所示:

Host username1-Bitbucket
    HostName bitbucket.org
    User username1
    IdentityFile ~/.ssh/username1-Bitbucket

Host username2-Bitbucket
    HostName bitbucket.org
    User username2
    IdentityFile ~/.ssh/username2-Bitbucket

Host *
    UseKeychain yes
    AddKeysToAgent yes
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/username1-Bitbucket
    IdentityFile ~/.ssh/username2-Bitbucket
    IdentitiesOnly yes
    PreferredAuthentications keyboard-interactive,password
  1. 将密钥添加到ssh-agent:

ssh-add --apple-use-keychain ~/.ssh/username1-Bitbucket

ssh-add --apple-use-keychain ~/.ssh/username2-Bitbucket

  1. 复制ssh密钥并将其添加到您的Bitbucket帐户中。请参见链接

pbcopy < ~/.ssh/username1-Bitbucket.pub

pbcopy < ~/.ssh/username1-Bitbucket.pub

  1. 检查是否连接到Bitbucket成功(至少一个),以便将Bitbucket添加为已知主机:

ssh -T git@bitbucket.org

  1. 使用ssh克隆您的存储库,并在终端中将cd更改到仓库文件夹。

  2. 检查存储库的远程url:

git remote -v

你会得到像这样的信息:

git@bitbucket.org:companyUserName/repositoryName.git

  1. 更改存储库的远程url:

git remote set-url origin username1@username1-Bitbucket:username1/repositoryName.git

git remote set-url origin username2@username2-Bitbucket:username2/repositoryName.git

所以我们把git@bitbucket.org:companyUserName/repositoryName.git更改为username1@username1-Bitbucket:username1/repositoryName.git

git -> username1username2,帐户的用户名。

bitbucket -> username1-Bitbucketusername2-Bitbucket,配置文件的主机别名。

companyUserName -> 这是持有存储库的帐户的用户名,在我们的情况下,存储库归属于username1或username2。

repositoryName -> 存储库的名称。

  1. 在两个存储库上测试您的连接,创建新分支并尝试推送它:

git checkout -b newBranch

git push origin newBranch

如果两个存储库都正常工作,则完成!

希望这个解决方案适用于每个Mac用户。

就这样吧!


1
ssh-add --apple-use-keychain ~/.ssh/username2-Bitbucket 重要提示 - Junior Usca

2
前置编辑:看起来Bitbucket现在已经停止支持下面描述的机制。截至今天,我正在使用@shannon-chou上面的解决方案,它运行得非常好。本帖的其余部分留在这里作为历史参考。--JBC,2019-06-23
2016年,BitBucket似乎添加了对一种更简单的解决方案的支持,不需要额外的ssh配置文件操作。具体而言,现在可以使用ssh用户名指示您要访问的帐户。例如,而不是使用git url

git@bitbucket.org:efhutton/squanzle.git

你可以使用Git的URL。

efhutton@bitbucket.org:efhutton/squanze.git

(或者ssh://efhutton@bitbucket.org/efhutton/squanze.git,看起来是等效的)
基本问题是您的ssh客户端将按固定顺序提供ssh密钥身份。假设您的工作帐户名为bobobogo,您的私人帐户名为efhutton,并且您的ssh客户端配置为首先提供注册在bobobogo上的密钥。如果您正在尝试访问与efhutton相关联的帐户,那么您的ssh客户端会提供bobobogo密钥,bitbucket接受它,然后观察到bobobogo帐户无权访问efhutton / squanze存储库,并阻止您。使用新机制,您告诉bitbucket您要使用授权给efhutton帐户的密钥,因此当您的ssh客户端呈现为bobobogo注册的密钥时,bitbucket拒绝它,您的ssh客户端可以呈现下一个密钥,这个密钥已经注册了efhutton帐户。
详情请参见此博客文章。

https://bitbucket.org/blog/better-support-multiple-ssh-keys

编辑:你看到上面的消息了吗?

这样做了一段时间,直到它突然停止工作。切换回旧的方式:http://blog.developer.atlassian.com/different-ssh-keys-multiple-bitbucket-accounts/ 完美地运行。 - Jacquen
根据 efhutton@bitbucket.org:efhutton/squanze.git - 如果 squanze.git 位于 Bitbucket 项目中,那么 URL 会是什么样子?你知道吗? - alex

2
请参考这个Github Gist。 https://gist.github.com/shakeeb91/cd3d3c387f339fbd93ac7388b3c885e0 1) 在主目录(~)下创建一个名为config的文件。 2) 添加以下代码:
Host myaccount2access
   HostName bitbucket.org
   User git
   IdentityFile /home/shakeeb/.ssh/newsshkey
   IdentitiesOnly yes
and then clone the repository.

请执行以下操作。确保使用自己的仓库详细信息。

git clone git@myaccount2access:shakeeb91/repository.git


0
如果您收到“ssh:Could not resolve hostname: Name or service not known”错误消息,则以下内容可能会有所帮助。
正如Shannon Chou的答案所指出的那样,您需要创建SSH别名。GitHub、BitBucket等网站都有关于如何创建别名的说明,但我在Windows 10上遇到了一个问题,这可能对其他人有所帮助。SSH有两个不同的配置文件:系统范围的配置文件和用户特定的配置文件。我阅读的说明,包括Shannon Chou的说明,都说要将别名添加到位于~/.ssh/.config的用户特定配置文件中。
在我的情况下,我需要将别名添加到系统范围的配置文件中,当在Windows 10上使用Git时,该文件通常位于Git目录下的C:\Program Files\Git\etc\ssh\ssh_config中。
您可以通过运行此命令来确定SSH正在使用哪个配置文件,“myalias”可以是任何字符串,我们感兴趣的只是输出的配置文件路径:
ssh -vv myalias

OpenSSH_7.1p2, OpenSSL 1.0.2d 9 Jul 2015
debug1: Reading configuration data /etc/ssh/ssh_config

请注意输出中的文件路径“/etc/ssh/ssh_config”。这告诉我们SSH在那里查找别名,而不是在~/.ssh/.config文件中。

0

如果其他评论方法不起作用,这是我为我的Bitbucket帐户所做的。

    Host *
         StrictHostKeyChecking=no
         UserKnownHostsFile=/dev/null

    Host nameOfSSH-Bitbucket bitbucket.org
    HostName bitbucket.org
    User myBITBUCKETUserName
    IdentityFile /Users/luisconstante/.ssh/nameOfSSH-Bitbucket

    Host nameOf2ndSSH-Bitbucket bitbucket.org
    HostName bitbucket.org
    User myBITBUCKET2ndUserName
    IdentityFile /Users/luisconstante/.ssh/nameOf2ndSSH-Bitbucket

    git remote add origin myBITBUCKETUserName@bitbucket.org:mybitbucketteam/my-cool-app.git
    git remote add origin myBITBUCKETUserName2@bitbucket.org:mybitbucketteam/my-cool-app2.git

如果您不想每次输入密码(这可能不安全),可以通过将密码提示留空来创建新的SSH密钥。

我尝试过UseKeychain yes,但失败了。这是对我有效的方法。

如果我漏掉了什么,请告诉我,这是对其他评论的补充。

2019年


0

如果你想为不同的项目使用不同的身份验证密钥,你可以简单地使用以下的git命令和配置:

  1. 在克隆时:

    • git clone -c "core.sshCommand=ssh -i ~/.ssh/BitbucketKey1 -F /dev/null" {your repo url}
  2. 对于现有的库:

    • 进入你的 .git 文件夹。
    • 编辑 config 文件。
    • 在 [core] 部分下添加以下一行:
    • sshCommand = "ssh -i ~/.ssh/BitbucketKey1 -F /dev/null"

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