多GIthub账户的SSH密钥管理

前言

由于最近不得已需要使用多个Github账户交替提交代码,于是记录一下多个Github账户的SSH密钥管理。

生成SSH密钥

假定我们需要一个Github账户提交个人代码,此外还需要创建一个新账户提交团队代码。首先,我们需要在本地为新的账户生成密钥。

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

过程中会选择密钥的密码和生成的文件名,自定义即可。下面用new_id_rsa代指生成的密钥文件

注册SSH密钥

使用该密钥之前,我们需要使用ssh-agent将其注册。首先我们要用如下命令确认ssh-agent正在运行

eval "$(ssh-agent -s)"

运行之后就可以进行ssh密钥注册

ssh-add ~/.ssh/new_id_rsa

在GIthub中添加SSH密钥

注册之后就可以使用该密钥,打开Github的账户设置,在SSH and GPG keys中添加本地生成的密钥,可以打开文件自行复制,也可以使用下面这条命令将其复制到粘贴板。

pbcopy < ~/.ssh/new_id_rsa.pub

配置本地ssh config文件

到目前为止我们已经有两个Github账户了,本地也拥有了两个密钥。我们在仓库工作时,使用git config命令设置好username和email,本地工作了几个commit之后准备提交代码。但是现在问题就产生了:当我们进行git push和pull操作时,git不知道使用哪个密钥进行身份验证,这样就无法向私有仓库提交代码。所以我们需要告诉git什么时候使用哪个密钥。

编辑.ssh下的config文件,如果没有就新建

vim ~/.ssh/config

编辑内容如下

Host new.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/new_id_rsa
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

其中,Host是区分不同账户的标志,所以创建的时候需要让Host值互不相同,下面的IdentityFile选择每个账户对应的密钥文件。修改文件后保存。

本地仓库的git config文件

如果仓库未clone到本地,那么当你执行clone命令时,需要将地址修改为对应的SSH密钥的Host值。譬如如果你入药clone一个仓库

git clone git@github.com:USERNAME/REPOSITORY.git

那么执行的时候就要修改为

git clone git@new.github.com:USERNAME/REPOSITORY.git

这样就会自动使用规定的SSH密钥进行clone。

如果仓库已经clone到本地,那么我们需要编辑一下remote的地址

// 切换到仓库文件夹 
vim .git/config

你可以看到这样一行

url = git@github.com:USERNAME/REPOSITORY.git

此时你可以将@后的地址修改为对应的SSH密钥的Host值,譬如

url = git@new.github.com:USERNAME/REPOSITORY.git

保存更改之后尝试提交就会自动使用规定的ssh密钥了。

总结

以上方法是通过修改ssh config中Host对应的密钥文件来达到使用不同ssh密钥的目的。其实Host并不一定是上面说到的二级域名的形式,可以是github.com-new或者任意字符串。只需要在进行操作的时候自行替换地址即可。

参考

Multiple SSH Keys settings for different github account