如何在GitHub上使用多个SSH密钥?

时间:2015-03-13 01:48:19

标签: git github ssh

GitHub上的SSH配置似乎是一场噩梦。我有多个GitHub帐户,但我可以拥有多个SSH密钥。在GitHub SSH配置部分,他们提到了这一点:

  

============
  ssh-keygen -t rsa -C“your_email@example.com”

     

使用提供的电子邮件作为标签

创建新的ssh密钥      

生成公钥/私钥rsa密钥对。

     

我们强烈建议保留默认设置,因此当系统提示您“输入要保存密钥的文件”时,只需按Enter继续。

     

#输入保存密钥的文件(/Users/you/.ssh/id_rsa):[按enter键]

为什么我总是要使用id_rsa文件?它将覆盖我现有的密钥。无论如何,我在这里给出一个新名称并生成密钥。我做了所有其他步骤,将其添加到代理,在GitHub SSH密钥部分进行更新。

完成所有这些步骤后,我将进入最后一步:

ssh -vT git@github.com
Hi animesh11! You've successfully authenticated, but GitHub does not     provide shell access.
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 3128, received 1976 bytes, in 0.5 seconds
Bytes per second: sent 6077.0, received 3838.9
debug1: Exit status 1

一切都是笨拙的,但不知怎的git clone还在抱怨:

MacBook-Pro:Documents animeshsaxena$ git clone git@github.com:regentmarkets/devbox.git
Cloning into 'devbox'...
ERROR: Repository not found.
fatal: Could not read from remote repository.

    Please make sure you have the correct access rights
and the repository exists.

I am up to my wits end why the ssh -vT works and simple cloning doesn't. It doesn't seem logical, why would github put this step in the manual if they know it's freaking useless.

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

我使用.ssh config为每个特定用户设置不同的配置。

例如,在用户root下的.ssh文件夹中编辑(或创建)配置文件,并添加与此类似的内容:

Host user1-github
    HostName github.com
    User git
    IdentityFile ~/.ssh/user1_rsa
Host user2-github
    HostName github.com
    User git
    IdentityFile ~/.ssh/user2_rsa

user1_rsauser2_rsa的输出ssh-keygen -t rsa -C "user1@example.com"ssh-keygen -t rsa -C "user2@example.com"的输出

然后,在测试时只需使用ssh -vT user1-githubssh -vT user2-github

此外,克隆回购时使用git clone user1-github:username1/project.gitgit clone user2-github:username2/project.git

答案 1 :(得分:4)

作为Serban解决方案的补充,这是使用.ssh/config文件来区分用户的另一种方法。有点骇人听闻,但不需要更改主机名。

假设您有一个专业人士和一个个人帐户,并且您设置了这样的密钥:

$ ssh-keygen -t rsa -f ~/.ssh/perso_rsa -C "nick@perso.org"
$ ssh-keygen -t rsa -f ~/.ssh/pro_rsa   -C "name.surname@pro.company.com"

现在大多数时候,您可以使用某些东西来区分这两个身份。通常,在使用git仓库时,您的git配置与您要使用的身份相关联,例如git config user.email将返回两个电子邮件地址之一,该电子邮件地址与此仓库的身份相关联。 / p>

基于此,我们可以在Match exec <cmd>中使用.ssh/config过滤指令,并编写如下代码:

Match host github.com exec "[ $(git config user.email) = nick@perso.org ]"
    IdentityFile ~/.ssh/perso_rsa

Host github.com
    IdentityFile ~/.ssh/pro_rsa

只需将常规git@github.com:user/project.git用于两个身份即可。

它的工作原理如下:当主机为github.com时,将使用第一个匹配规则来确定要使用的IdentityFile。对于第一个规则,运行exec命令,并且如果该命令返回零退出状态,则选择该规则。我们的测试(传递到用户的外壳程序)检查git config user.email是否返回nick@perso.org。如果是这种情况,则检查返回true,匹配规则,并选择~/.ssh/perso_rsa。如果不是,则第二条规则充当github.com的包罗万象,而选择~/.ssh/pro_rsa

我们本可以为第二个身份添加另一个检查,但是只用两个规则就没有必要,“包罗万象”的行为就足够了。

我们还可以对检查进行调整,以测试git中user.email插入的其他参数。例如,我们可以检查当前工作目录的名称。有关man ssh_config的更多详细信息,请参见Match exec

其他说明(归功于Acumenus)

  • 如果用户的外壳程序(至少bash,zsh)支持,则如果支票的一部分(在我们的情况下为$(git config user.email))评估为多个单词,则必须使用双方括号,因为单括号将{{3 }}。理想情况下,我们希望在双引号之间使用双引号,但是它们已经用于exec的自变量,并且我没有找到一种方法来转义它们。
  • 通过此设置,通过SSH克隆新存储库将使用与默认用户电子邮件关联的密钥(user.email中的第一个git config -l条目)。要使用另一个密钥克隆存储库,一种解决方案是首先创建存储库,然后添加一个远程对象并拉出:mkdir foo; cd foo; git init; git config ...; git remote add origin <URL>; git pull
  • 如果密钥文件是ssh在默认情况下寻找的文件,例如$HOME/.ssh/id_rsa,则当然不需要全部采用规则。
  • 如有必要,host指令可用于一次匹配多个逗号分隔的主机(Match host github.com,gitlab.com exec ...)。

答案 2 :(得分:0)

我可以谈谈这个问题!这也发生在我身上:

ERROR: Repository not found.
fatal: The remote end hung up unexpectedly

我被告知发生这种情况的最常见原因是因为存储库名称中的拼写错误(区分大小写),存储库是否确实存在?它也可能是查看存储库的错误权限,或者在极少数情况下,对存储库的错误SSH访问设置。

我在Stack Overflow问题 GitHub: ERROR: Repository not found. fatal: The remote end hung up unexpectedly (different from similar posts apparently) 中找到答案。