如何:一个server上配置多个github deploy key

如果您是一个github的使用者,那么你一定会接触到deploy key这个概念。deploy key基本就是github的权限控制了,被授予的机器才能有读或读写的能力。

如果你的server上只部署一个app的话,那用起来就很简单:

  1. 通过ssh-keygen命令生成rsa凭证到 .ssh/ 文件夹下
  2. 拷贝对应的公钥文件内容
  3. 进入github的项目Settings中,选择左边栏Deploy keys
  4. 点击Add deploy keys,复制即可

理论上以上四个步骤就足够,不过你还可以运行以下命令来测试ssh连接

1
ssh -T git@github.com

如果一切顺利,你将会得到:

1
Hi LinkFirms/Apollo! You've successfully authenticated, but GitHub does not provide shell access.

在大多数情况下以上就够用了,但是 …(是的,总是会有一个但是的)

如果当你碰到某种情景(比如不能土豪到一个app装在一个server上,同一个github组织下的两个项目等),需要将多个app在同一个server上host,那么你可能遇到一个麻烦:如何让命令知道我的另外一个项目的存在。事实上如果不做任何事情的话,你将总会遇到repo不存在或者检查权限的提示。经过一些搜索之后,借鉴 USING MULTIPLE GITHUB DEPLOY KEYS FOR A SINGLE USER ON A SINGLE LINUX SERVER 这篇文章大概找到了解决方案。方法是通过ssh config的方式,来指定对应的请求,感兴趣的可以了解一下什么是ssh config:OpenSSH Config File Examples。经试验,最终的解决方案与文中提供的答案略有出入。

步骤如下:

  1. 按照之前的步骤为项目B再单独进行一遍,这样你就有了两对ssh key和秘钥,并均已添加到对应github项目的设定中。
  2. 在 .ssh/ 文件夹下创建 config 文件。
  3. 编辑config文件。

示例config文件如下;

1
2
3
4
5
6
7
8
9
Host manhattan
HostName github.com
User git
IdentityFile /home/deploy/.ssh/id_rsa_manhattan

Host apollo
HostName github.com
User git
IdentityFile /home/deploy/.ssh/id_rsa_apollo

其中manhattan和apollo是两个项目配置的代号,在测试ssh连接的时候可以用这两个代号。比如:

1
2
3
4
deploy@iZ28lie0h28Z:~$ ssh -T apollo
Hi LinkFirms/Apollo! You've successfully authenticated, but GitHub does not provide shell access.
deploy@iZ28lie0h28Z:~$ ssh -T manhattan
Hi LinkFirms/Manhatton! You've successfully authenticated, but GitHub does not provide shell access.

如此!便大功告成!


可是还是有很多无辜的人说:为神马还是不行。解决方案来啦:首先请确定不是 ssh-agent 的问题,然后请不要再使用

1
git clone git@github.com:LinkFirms/Apollo.git

而是使用

1
git clone git@apollo:LinkFirms/Apollo.git

使用原来的方式的话,如果多个项目在同一个域名下(比如github.com),那么你只能连接到最先出现的那个项目。所以你需要以代号的方式,那样就能正确解析到其他的项目了。其实如果在测试连接的时候,打开详细说明的话就能看出一些问题,运行以下命令:

1
ssh -vT apollo

这样的话,就会把详细的流程打印出来,就会发现ssh在找到第一个匹配之后就不会再找了。