如何在同一系统中维护多个具有多个 ssh 密钥的 bitbucket 帐户

Posted

技术标签:

【中文标题】如何在同一系统中维护多个具有多个 ssh 密钥的 bitbucket 帐户【英文标题】:How to maintain multiple bitbucket accounts with multiple ssh keys in the same system 【发布时间】:2014-02-04 01:40:30 【问题描述】:

我有多个 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

所以这是我的问题: 在推送到任何 repo git 时询问第一个 ssh_key 密码。 每次我将 git config 中的 user.name 更改为 git config user.name "mybitbucketusername"。 所以请告诉我如何在同一个系统中维护多个具有多个 ssh 密钥的 git 帐户

我试过How to work with multiple ssh keys,Multiple bitbucket accounts 但是没用

push using multiple account / multiple identity on github / bitbucket 到现在为止有点帮助

【问题讨论】:

user.name 与您的 bitbucket 帐户无关。根据 git 文档:“user.name:要记录在任何新创建的提交中的全名。可以被 GIT_AUTHOR_NAME 和 GIT_COMMITTER_NAME 环境变量覆盖。请参阅 git-commit-tree(1)。”你的问题是什么,你想达到什么目标? 你检查过这个吗? gist.github.com/jexchan/2351996 能否请您从您的项目中添加您的“.git/config”,当然将您的用户名和项目更改为 USERNAME 和 PROJECT Specify an SSH key for git push for a given domain的可能重复 您必须更改远程 url 以包含您的别名,而不是 'bitbucket.org'。 【参考方案1】:

为 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

要为两个身份(workid 和 personalid)创建配置文件,您需要执行以下操作:

    打开一个终端窗口。

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

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

    Host workid
     HostName bitbucket.org
     IdentityFile ~/.ssh/workid
    Host personalid
     HostName bitbucket.org
     IdentityFile ~/.ssh/personalid
    

    关闭并保存文件。

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

将每个密钥加载到相应的 Bitbucket 帐户中

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

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

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

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

这里指的是官方解决方案Configure multiple SSH identities for GitBash, Mac OSX, & Linux,对我来说很好用!

【讨论】:

作为 .ssh/config 中的补充,我必须添加“IdentitiesOnly yes”,否则尝试在 bitbucket 上使用我的默认 id_rsa 并失败,因为它与现有的其他帐户相关联(在 bitbucket 上),用于登录。 对我有用的主要是For example, ssh URL as: git@bitbucket.org:accountname/reponame.git then clone the repository using: git clone git@personalid:accountname/reponame.git 我不明白git@alias:accountname/reponame.git 位。如果您的存储库命名空间位于 Bitbucket 项目下怎么办?你能提供更多的例子吗? 感谢您提供详细的步骤。 像魅力一样工作!如果您已经有一个存储库,只需编辑.git/config,将bitbucket.org 域替换为alias,就可以了。在[remote "origin"] => url = git@<alias>:<account>/<reponame>.git【参考方案2】:

如果您收到“ssh:无法解析主机名:名称或服务未知”错误,以下可能会有所帮助。

正如 Shannon Chou 的回答所指出的,您想要创建 SSH 别名。 GitHub、BitBucket 等有关于如何执行此操作的说明,但我在 Windows 10 上遇到了一个可能对其他人有帮助的问题。 SSH 有两个不同的配置文件:系统范围的配置文件和用户特定的配置文件。我阅读的说明,包括 Shannon Chou 的说明,都说要将别名添加到位于 ~/.ssh/.config

user-specific 配置文件中

就我而言,我需要将别名添加到 system-wide 配置文件中,在 Windows 10 上使用 Git 时,该文件通常位于:C:\Program Files\Git\etc\ ssh\ssh_config,在 Git 的目录中。

您可以通过运行此命令来确定 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 文件中。

【讨论】:

【参考方案3】:

上述~/.ssh/config 方法的替代方法是在克隆命令本身中指定配置变量core.sshCommand。例如,

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

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

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

这在 git 版本 2.10 及更高版本中受支持。

【讨论】:

这是我 ubuntu 客户端上 2019/06 年唯一可行的解​​决方案。【参考方案4】:

前面编辑: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-key 身份。假设您的工作帐户名为 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

编辑:您在顶部看到了消息,对吗?

【讨论】:

这样做了一段时间,直到它突然停止工作。切换到旧方式:blog.developer.atlassian.com/… 完美。 Per efhutton@bitbucket.org:efhutton/squanze.git - 如果 squanze.git 位于 Bitbucket 项目下怎么办?你知道在这种情况下 URL 是什么样的吗?【参考方案5】:

如果其他 cmets 不起作用,这是我为我的 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,但失败了。这对我有用。

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

2019

【讨论】:

【参考方案6】:

如下编辑你的 ~/.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

【讨论】:

这对我有用,但稍作修改 - Host 字段在两种情况下都必须相同,例如Host bitbucket.org 而不是 Host bitbucket.org-yourusername【参考方案7】:

请遵循这个 Github gist 以供参考。 https://gist.github.com/shakeeb91/cd3d3c387f339fbd93ac7388b3c885e0

1) 在主目录的 ~/.ssh/config 中创建配置文件。 2)添加代码:

Host myaccount2access
   HostName bitbucket.org
   User git
   IdentityFile /home/shakeeb/.ssh/newsshkey
   IdentitiesOnly yes
and then clone the repository.

比往下跑。确保使用您自己的 repo 详细信息。

git clone git@myaccount2access:shakeeb91/repository.git

【讨论】:

以上是关于如何在同一系统中维护多个具有多个 ssh 密钥的 bitbucket 帐户的主要内容,如果未能解决你的问题,请参考以下文章

markdown 如何配置ssh配置以使多个私有github依赖关系具有多个部署密钥和自动部署。

同一个电脑使用多份密钥文件绑定多个帐号

为不同的 GitHub 帐户使用多个 SSH 密钥

git本地管理多个密钥/账户

如何处理多个 ssh 密钥

如何管理 ~/.ssh 目录中的多个 ssh 密钥