Set multiple ssh-key for different github accounts

Pre

使用github pages搭建博客的时候突发奇想新建一个账户。
原因是pages域名直接和你的账号名挂钩,一是直觉上让我不舒服,二是想换个别的名字。

Issue

新建账户很简单按流程操作,不过当添加ssh-key的时候遇到了问题。
ssh-key is alreay in use
意思这个key已经被添加进github过了。github规定一个key只允许被一个账户使用,只能添加一次,就是说不同的账户必须用不同的key。

Solution

解决思路也很简单,就是在新建另外一个key用于新建的账号。
不过有个问题要注意下,那就是当我们电脑中只有一个ssh-key的时候可能一路默认配置就完事了,但是当存在多个key的时候怎么在不同情况下使用特定的key呢?
答案是ssh-agent以及ssh的config文件,它们就是用来控制ssh相关的种种行为的。

Steps

生成key,注意保存为新的rsa文件,防止覆盖了你的原先的。

1
2
3
$ cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "new@github.com"
$ Enter file in which to save the key (/Users/******/.ssh/id_rsa): id_rsa_new

将key 加入ssh-agent

1
2
3
eval "$(ssh-agent -s)"
Agent pid 2897
ssh-add -K ~/.ssh/id_rsa_new

Edit config file

为新的账号配置进行连接要使用的key。

1
2
3
4
Host new.github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_new

这里解释下HostHostName的作用,
Host是你进行连接时你输入给系统的字面值,系统会根据Host来找到HostName,实际连接用的是Hostname的值。
看一段解释

1
2
3
4
5
6
7
8
9
10
"About difference between host and hostname"

Host host1
HostName host1.example.com
Host host2
HostName anotherdomain.com

"Then when you type"
"ssh host1 : you actually login to host1.example.com"
"ssh host2 : login to anotherdomain.com"

有可能你会疑惑为什么要多此一举,直接HostName不就行了?
事实一般也确实没有要多一道这个转换的,所以一般情况下这两个值是一样的。不过有时候这个设置会很有用,比如现在我们遇到的情况:
我们要区分的两个账号都是github账号,没有办法按照域名来区分,虽然我们知道哪个仓库该用哪个地址,但是对系统来说都是连接的同一个Host,也只会使用同一个ssh-key,这样会因为key不对而连接失败。
这时候Host就派上用场了,注意我上面配置文件里,Host写的是new.github.com,但是HostNamegithub.com

当我连接新账号的仓库时我会这么写,
git clone git@new.github.com:****/*****.git
当我连接旧账号的仓库时我会这么写,
git clone git@github.com:****/*****.git
它们实际上都还是连接的正常的github.com,但是会使用不同Host里的配置,从而使用不同的key,这样就成功进行了区分。

Add Public key to your new created account

cat ~/.ssh/id_rsa_new.pub | pbcopy .

Test

1
2
3
4
$ ssh -T git@github.com
Hi OriginUserName! You've successfully authenticated, but GitHub does not provide shell access.
$ ssh -T git@new.github.com
Hi NewUserName! You've successfully authenticated, but GitHub does not provide shell access.

⚠️ Pay Attention When Use

当你想使用新账户下仓库时,你连接时写的仓库url就需要改成Host的值, 上面提到过