配置 SSH 管理多个 Git 仓库和以及多个 Github 账号
基本介绍
使用场景
假如你拥有多个github账户,那么在编辑和push 仓库的时候需要指定特定用户进行登录,对于github仓库管理是通过ssh与github进行通讯的,那么就需要管理不同的账户下的SSH配置,即SSH公钥和 私钥。
SSH
如果我们要使用 Github 这种 git 代码托管平台的话,首先本地要生成一个 SSH 私钥(如id_rsa)
和 公钥(如id_rsa.pub)
,然后将 公钥
填写到 Github 的 SSH Key 管理面板中。当我们向 Github 推送代码的时候会首先发起身份校验。此时,本地会将用户信息通过 SSH 私钥
执行『签名』操作
本地 - 私钥 - id_rsa
github - 公钥 - id_rsa.pub
通过配置各个用户名的公钥和私钥,在使用的时候指定使用对应的私钥即可通过认证,进行通讯和数据传输。举例来说,如果我们要使用 Github 这种 git 代码托管平台的话,首先本地要生成一个 SSH 私钥(如id_rsa)
和 公钥(如id_rsa.pub)
,然后将 公钥
填写到 Github 的 SSH Key 管理面板中。当我们向 Github 推送代码的时候会首先发起身份校验。此时,本地会将用户信息通过 SSH 私钥
执行『签名』操作。当签名信息发送到 Github 的时候,Github 就会使用用户保存在平台上的 公钥
来校验签名信息,使用 私钥
签名信息只能由对应的 公钥
进行校验,因此如果 Github 对签名校验通过,就可以认证当前的用户对代码仓库拥有响应的操作权限,之后就可以让用户提交的代码入库了,整体流程如下图:

使用
SSH公钥/私钥生成
进入到 ssh 目录下,windows一般是:C:【用户名】\.ssh
假设你的邮箱是 aaa@126.com
生成一对 SSH 密钥
1 | ssh-keygen -t rsa -C "aaa@126.com" |
这个指令的意思是使用 ssh-keygen
生成密钥,-t
参数密钥的加密方式是 rsa
,-C
参数可以为密钥指定备注,通常备注可以为你的邮箱,或者你也可以写成你要连接的远程服务器名(总之不重要)
输入完成之后会进入一个交互式终端界面,首先会询问你的密钥文件名称:
1 | Enter file in which to save the key (/Users/username/.ssh/id_rsa): |
我们可以使用回车跳过,那么密钥文件名称就自动生成为 id_加密方式
,如 id_rsa
。
之后会提示用户输入密码:
1 | Enter passphrase (empty for no passphrase): |
这个密码是用来保护你的私钥的,我们这里避免麻烦可以直接跳过。
完成以后,目录下会产生私钥文件 id_rsa
和公钥文件 id_rsa.pub
. 如果你之前和其他网站也配置过 ssh 产生过这些文件,注意先备份一个,因为这个操作会覆盖原来的同名文件。
随后到github 上选择 setting → ssh and GPG keys → new ssh key

随后把公钥里的内容粘贴到 key里,title可随意命名

config 文件配置ssh
一般来说如果没有其他指定的配置,在访问的时候会自动使用 id_rsa
作为认证私钥,如果单一账户不需要配置,如果你配置了多个ssh,则需要通过config
文件配置
假设 你在github 有两个账户 aaa,bbb 对应的私钥 id_rsa
重命名为 aaa_id_rsa 和 bbb_ id_rsa
- 账户1 : aaa , 对应私钥 :
1 | # github 主账号的配置 |
从上面配置文件可以看到 Host别目和公钥是二者的主要区别, user 设定为git是访问GitHub是需要使用的统一用户名,其实写不写都无所谓,ssh 连接主要是通过这里 hostname确定要用哪一个私钥进行认证
config 配置文件中的各项配置意思为:
- Host:指定连接到的主机名,可以随意指定,相当于实际连接目标主机的别名;
- User:指定使用的用户名,通常为 git,也可以不指定;
- Hostname:指定连接到的主机的实际域名或IP地址。如果是向 Github 推送代码,则为 github.com,如果是向公司的 Git 代码托管平台推送代码,则填写公司主机的地址
- Port:SSH 服务的端口号,默认为 22,可以不写
- PreferredAuthentications:指定优先使用的身份验证方法,指定为publickey,即使用公钥进行身份认证。
- IdentityFile:指定要使用的私钥文件路径,即指向你创建的私钥,我们这里分别为不通的 Git 代码托管平台指定了不同的私钥
测试连接
然后我们来测试一下连接:
1 | ssh -T git@github_aaa |
由于你的代码的仓库源在 Github 上,因此 SSH 连接的主机就是 github.com
,github_aaa 对应的实际主机就是github.com, git是默认访问github的用户名, 由于在这里制定了use,因此配置文件里的usr并不起作用。 如果输出的用户名是你的小号,那就说明可以正常在刚才的那个仓库里推送代码了。
拉取仓库
这个时候,你从小号的 Github 中 clone 下来一个仓库,假设地址为 git@github.com:user_x/blog.git
,那么就在终端中的host:github.com 改为 github_aaa:
1 | git clone git@github.com:user_x/blog.git |

提交
#TODO
REF: