前段时间由于实验室项目工作需要,用实验室的公有邮箱额外注册了一个Github帐号用于内部项目的提交。然而,在一台机器上直接地使用多个帐号的SSH密钥是存在问题的,如果不经过谨慎的配置管理,将可能出现提交身份串用的问题。

分析🔍️

假定目前我们已经为两个或者多个Github帐号配置了SSH密钥,那么我们要做就是利用SSH和Git工具的配置规则来更改不同场景下应该使用的SSH密钥。

OpenSSH的配置🔑️

一般而言,OpenSSH的用户配置文件默认路径为~/.ssh/config(对于Windows系统,一般为用户目录下的.ssh/config)。当该文件不存在时,意味着本机尚未配置任何SSH连接,需要手动创建该文件:

touch ~/.ssh/config

接下来,我们需要为不同的Github帐号设定不同的密钥认证文件,在~/.ssh/config中加入以下模板:

# Personal Github Account
Host github-mine
  HostName github.com
  User git
  IdentityFile ~/.ssh/key_mine

# Lab Github Account
Host github-lab
  HostName github.com
  User git
  IdentityFile ~/.ssh/key_lab

此处IdentityFile的含义即为指定SSH密钥文件。

经过以上配置,我们就可以使用我们自定义的规则去克隆在不同Github帐号下的仓库了。只需要将SSH克隆地址中的github.com替换为我们在SSH配置文件中的特定HOST即可,例如:

git clone git@github.com:xxxx/repo.git # 正常地址
git clone git@github-mine:xxxx/repo.git # 使用帐号A的密钥
git clone git@github-lab:xxxx/repo.git # 使用其他帐号的密钥

同样地,我们也可以设定一个缺省值,即对于正常SSH克隆地址使用的密钥:

# Default Account
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/key_default

结束了吗?🤔️

显然,我们还没修改Git提交时的邮箱身份。对于不同帐号的仓库,我们需要单独设定其提交邮箱身份:

cd xxx/xxx/repo_a # 到仓库a
git config --local user.email "abc@gmail.com" # 设定仓库a的邮箱身份
git config --local user.name "abc" # 设定仓库a的用户身份

同样地,我们可以设定全局的默认身份:

git config --global user.email "me@gmail.com"
git config --global user.name "me"

验证✅

最后我们可以验证一下实际上是否使用了我们在SSH配置文件中指定的密钥:

ssh -T github-mine
ssh -T github-lab