github多个ssh key配置

github上可以添加两种ssh key:account key和deploy key。

前者用于标示一个github用户,在用户的settings里面可以管理;
后者相当于Repo-Specified key,仅用于某个特定的repo,在repo页面的settings里面管理,deploy key可以被设置成read-only,即不能push。
这些key在整个github范围中是唯一的,即一个key被加到某个account后,这个key就不能加到其他account中,甚至不能添加到自己account下某个repo的deploy key列表中。

对于account ssh key,很好理解,有了它就可以access到自己能访问到的所有仓库;
对于deploy ssh key,有了它,只能access到对应的repo。

所以,如果你在私人机器上操作自己的所有仓库,那用account ssh key就好了;
如果你要在一台公共的机器上,操作自己的某个仓库,那一定要用deploy ssh key(好吧,我有点废话了,deploy这个名字就说明了一切,是用于部署用的)。

如何生成key呢?最傻瓜的方式:ssh-keygen,默认rsa,会问你私钥存储的路径,默认为~/.ssh/id_rsa

git操作(其实是ssh)默认使用~/.ssh/id_rsa这个key,但如果你需要access github上不同account的不同repo时,只用这个默认key显然是行不通的(理由上面已经说了,所有keys在github范围内唯一)。

下面以常见case为例,讲一下整个的操作流程。

首先,有两个仓库:
git@github.com:xxx/xxx1.git
git@github.com:yyy/yyy1.git
现在要把这两个仓库部署到一台共用机器上,显然,两个仓库都应该用depoly key。

  • 生成ssh key:
ssh-keygen -t rsa -f ~/.ssh/id_rsa_github_xxx_xxx1_d
ssh-keygen -t rsa -f ~/.ssh/id_rsa_github_yyy_yyy1_d
  • 把id_rsa_github_xxx_xxx1_d.pub和id_rsa_github_yyy_yyy1_d.pub添加到两个仓库的deploy key列表中

  • 编辑~/.ssh/config文件(如果该文件不存在,则touch ~/.ssh/config后再编辑),添加以下内容:

Host github-xxx1
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github_xxx_xxx1_d
    IdentitiesOnly yes

Host github-yyy1
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github_yyy_yyy1_d
    IdentitiesOnly yes

以上内容的作用是,添加了两个ssh host,并为其指定了ssh用户名以及使用哪个私钥。需要注意的是,Host字段只是别名,可以任意取,HostName字段是真实的主机名。

  • 测试一下是否OK:
ssh -T github-xxx1

如果返回以下内容,说明ok:

Hi xxx/xxx1! You've successfully authenticated, but GitHub does not provide shell access.

注意到Hi后面返回的用户名是xxx/xxx1,表示这个key是一个deploy key,如果是account key,则会返回xxx

  • 然后git可以这样操作:
git clone github-xxx1:xxx/xxx1.git
...
git pull

注意到URL Host不能使用git@github.com,而应该使用~/.ssh/config中定义的host

  • yyy/yyy1仓库以此类推。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据