git使用多个SSH公钥连接多个github远程仓库

摘要:默认情况下,单台机器只能使用一个与账户对应的SSH密钥连接github,这给多用户连接多账户带来不便。可利用config文件解决这一问题。

需求

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

问题描述

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

origin  git@github.com:user1Name/repositorie1Name.git (fetch)
origin  git@github.com:user1Name/repositorie1Name.git (push)

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

ERROR: Permission to user2Name/repositorie2Name.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 的账户中添加 user1 的公钥?也是不可能的,会提示公钥已经被使用。

解决方案

  1. 在 user2 的项目目录中打开命令行,执行命令:ssh-keygen -t rsa -C "second@email.com" -f ~/.ssh/id_rsa_for_user2,生成专属 user2 的密钥对,再进入 user2 的 github 账户配置公钥。
  2. ~/.ssh/ 目录下新建 config 文件,写入以下内容:

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

macOS 路径:~/user/.ssh

#Default GitHub
Host user1
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa

Host user2
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_for_user2
  1. 回到命令行,执行命令:$ git remote set-url origin git@user1:user1Name/repositorie1Name.git,修改默认的关联。也可以把原有的默认关联删除,重新添加。
  2. 再继续执行命令:$ git remote add origin2 git@user2:user2Name/repositorie2Name.git,新添加一个 user2 的关联。
  3. 此时执行命令:$ git remote -v,应是以下结果:
origin2  git@user2:user2Name/repositorie2Name.git (fetch)
origin2  git@user2:user2Name/repositorie2Name.git (push)
origin  git@user1:user1Name/repositorie1Name.git (fetch)
origin  git@user1:user1Name/repositorie1Name.git (push)
  1. 验证。可分别执行命令:$ ssh -T git@user1$ ssh -T git@user2,均出现连接成功提示。至此,实现了多个 SSH 公钥连接多个 github 远程仓库的需求。

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容