多重 SSH Keys 与 Github 账号

使用情境

工作上需要用公司的 email 申请一个新的 Github 帐号,这样一来我的系统上就有两个 Github 帐号用于开发…orz,总之今天摸索了一下多重 SSH key / GitHub 帐号时的应对方式。

需求

  1. 透过 SSH 而不是 HTTPS 来 clone / fetch / push (这样就不需要每次 push 都输入 GitHub 帐号密码)
  2. 两个帐号:
    1. 平常自己用的 GitHub 帐号
    2. 公司用的 Github 帐号 (以下假设为 YOU@COMPANY.com
  3. 在 clone 时就决定用哪个帐号来 clone。
  4. 以后 git push 时,根据 clone 时选的帐号,来自动选择正确的 SSH key。
协定长怎样需要 Github 密码
SSHgit@github.com:USERNAME/REPONAME.git不用
HTTPShttps://github.com/USERNAME/REPONAME.git每次 push 都要

1. 建立新的SSH密钥并绑定该密钥给Github帐号

cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "YOU@SELF.com"
chmod 400 ~/.ssh/id_rsa

# 通过 -f 指定一个密钥 别名为 id_rsa_github
ssh-keygen -t rsa -b 4096 -C "YOU@COMPANY.com" -f "id_rsa_github"
chmod 400 ~/.ssh/id_rsa_github

假设这里建立了一个叫 COMPANY 的 SSH 密钥。做完后,会这在 ~/.ssh/ 下产生两个新的档案。.pub 结尾的是公共密钥,另一个则是私钥。

这时打开Github web界面中的帐号设置,选择SSH密钥那一页,然后把公钥整个档案的内容 copy 下来贴进去。

  • 给不知道非对称加密的基本概念的人:公钥是公开给别人看的,私钥则是打死不能给任何人看的,不要搞错了。我遇过很有趣的一次是对方把他的私钥贴给我了…
  • 给不知道Passphrase是什么东西的人:passphrase跟Github密码毫无关系,这只是让private key多一层保障。在建立SSH key时如果有指定passphrase,以后就算有人拿到你的private key档案也没办法用他。缺点是会导致每次推送都要输入passphrase(虽然是不用输入Github的帐号密码了)。

2.设置Bash / Zsh别名方便克隆

为了以后方便挑选不同帐号 git clone~/.zshrc~/.bashrc 内加入:

alias company-git-clone='git clone --config user.name="YOUR NAME" --config user.email=YOU@COMPANY.com $@'

以后就只要输入 company-git-clone REPO-SSH-URL ,效果就等同于:

git clone REPO-SSH-URL
cd REPO
git config user.name "YOUR NAME"
git config user.email YOU@COMPANY.com

注意!其实这部份跟SSH密钥之间并没有关联。设定 user.nameuser.email 其实就只是以后你在该库下承诺时,会在提交日志中显示的名子跟电子邮件而已。所以当然,(如果公司没有特别规定的话)你也可以在这里填满自己常用的电子邮件,而不是公司的电子邮件。

你可能会记得,你生平第一次使用git前应该有设定过类似这样的东西:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

这里因为有用 --global,所以这是写入到你的家目录下 ~/.gitconfig 设定档中。如果不加--global参数,就变成写入当前$PWD所在的git repository的 .git/config设定档中。

现在你应该能够明白上面这个alias在干吗。总之就是如果 repo/.git/config 没有特别指定的用户,就会直接用 ~/.gitconfig 里的。

git config -l 可以查看 git 配置

3.建立〜/ .ssh / config

现在建立 ~/.ssh/config 这个档案,加入如下内容

#自己私人用的 GitHub 账号,id_rsa 就是我自己原本用的 ssh key
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa

#公司工作用的 GitHub 账号,此处的 COMPANY 你可以自行取名
Host github-COMPANY.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github
  • Host github.com 指定 key 的 Host 名字,此处必须用本地 repo 的 hostname github.com
  • Hostname github.com 指定 Host 对应的具体域名,这里跟 Host保持一致。(Host 跟 Hostname 可以不一致,但是 Host 必须跟 repo 的 hostnam 保持一致,也就是 git 到时候会用自己 repo 的 hostname 来 ssh 配置文件里面找是不是有对应的 Host,找到了就使用该配置,具体访问的域名会采用 HostName )
  • User git 说明该配置的用户得是git
  • IdentityFile ~/.ssh/id_rsa 指定了该使用哪个ssh key文件,这里的key文件一定指的是私钥文件。
  • IdentitiesOnly yes 请配置为yes,具体意义可以参考讨论

4.如何使用?

拿我的一个小玩具 repo kuanyui/takahashi.js 考虑到示例:

指令用了~/.ssh/下的哪个key会用哪个git user(commit log显示哪组的name/email)
Vgit clone git@github.com:kuanyui/takahashi.js.gitid_rsa~/.gitconfig 内的设定
company-git-clone git@github.com:kuanyui/takahashi.js.gitid_rsatakahashi.js/.git/config 内的设定
git clone git@github-COMPANY.com:kuanyui/takahashi.js.gitCOMPANY~/.gitconfig 内的设定
Vcompany-git-clone git@github-COMPANY.com:kuanyui/takahashi.js.gitCOMPANYtakahashi.js/.git/config 内的设定

我们要用的就是打V的那两个。

只要用这种方法,以后 push 时,就会自动选择要用哪个 ssh keypush到 GitHub 帐号了。

你可以试着做上面的动作,仔细观察每次 clone REPO 下来后,REPO/.git/config 的内容差异,一旦了解它们是差在哪,你就会很难忘记这些概念了。

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22