使用多个-SSH-公钥连接多个-GitHub-远程仓库

需求

机器 A 一直使用账户 user1 的 SSH 公钥连接 github。现在新建账户 user2,希望在机器 A 也能够以 SSH 方式连接到 github

问题描述

默认情况下,即机器 A 一直使用账户 user1。此时使用命令 $ git remote -v 可以查看当前的远程仓库关联如下:

1
2
origin  git@github.com:user1/repositorieName1.git (fetch)
origin git@github.com:user1/repositorieName1.git (push)

如果 user2 新建一个名为 repositorieName2 的仓库,此时想在机器 A 上使用命令 $ git push -u origin master 提交到远程仓库,会出现如下的错误。

1
2
ERROR: Permission to user2/repositorieName2.git denied to user2.
fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

问题原因

机器 A 当前的公钥是 user1 的,user2 没有权限使用;想在 user2 的 github 账户中添加 user1 的公钥?也是不可能的,会提示公钥已经被使用。

解决方案

  1. 在 user2 的项目目录中打开命令行,执行命令:ssh-keygen -t ed25519 -C "second@email.com" -f ~/.ssh/id_rsa_for_user2,生成专属 user2 的密钥对,再进入 user2 的 github 账户配置公钥。

使用 ed25519 是参考了 github 相关文档

  1. ~/.ssh/ 目录下新建 config 文件,写入以下内容:

win10 路径:C:\Users\Admin\.ssh

macOS 路径:~/user/.ssh

1
2
3
4
5
6
7
8
9
10
#Default GitHub
Host user1
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user1_publickey

Host user2
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user2_publickey
  1. 回到命令行,执行命令:$ git remote set-url origin git@user1:user1/repositorieName1.git,修改默认的关联。也可以把原有的默认关联删除,重新添加。
  2. 再继续执行命令:$ git remote add origin2 git@user2:user2/repositorieName2.git,新添加一个 user2 的关联。
  3. 此时执行命令:$ git remote -v,应是以下结果:

如果 clone 用户名 user1 的远程仓库,命令要相应修改为 git clone -b main git@user1:user1/repositorieName1.git

1
2
3
4
origin2  git@user2:user2/repositorieName2.git (fetch)
origin2 git@user2:user2/repositorieName2.git (push)
origin git@user1:user1/repositorieName1.git (fetch)
origin git@user1:user1/repositorieName1.git (push)
  1. 验证。可分别执行命令:$ ssh -T git@user1$ ssh -T git@user2,均出现连接成功提示。至此,实现了多个 SSH 公钥连接多个 github 远程仓库的需求。

要加 git@ 前缀,否则提示 Permission denied (publickey)(win10 环境,macOS 未实测)

1
Hi user1! You've successfully authenticated, but GitHub does not provide shell access.
1
Hi user2! You've successfully authenticated, but GitHub does not provide shell access.

注:github 添加的是如果是 deploy key,会显示库名称,如:username/xxx