出于各种原因,有些人会有多个Github账号,比如一个个人账号,一个工作账号。而Github是不允许两个账号出现相同的SSH key的。

以前我们为了方便,往往都是用ssh-keygen命令,默认在~/.ssh目录下生成一对名为id_rsaid_rsa.pub的密钥,然后把id_rsa.pub复制到Github的SSH and GPG keys设置中去。

那么问题来了,如何生成一个新的密钥给另一个账号,并且在使用的过程中尽量减少麻烦呢?


思路

用ssh方式链接到Github,需要唯一的公钥,如果想同一台电脑绑定两个Github帐号,需要两个条件:

  • 电脑生成两对私钥/公钥
  • push时,可以区分两个账户,推送到相应的仓库

解决方法:

  • 生成私钥/公钥时,密钥文件命名避免重复
  • 设置不同的Host对应同一个HostName但密钥不同
  • 取消Git全局用户名/邮箱设置,为每个仓库单独设置 用户名/邮箱

操作

1、查看自己是否已经创建了SSH key

windows下打开Git bash,进入.ssh目录:

ls ~/.ssh

如果看到 id_rsaid_rsa.pub 则说明已经有一对密钥,那么你可以跳过步骤 2,直接进入步骤 3。

如果没有,则需要继续步骤2,先生成一对密钥。

2、生成密钥

ssh-keygen -t rsa -f ~/.ssh/id_rsa -C "artjay.code@gmail.com"

解释几个参数:

  • -t 指定密钥类型,默认是 rsa ,可以省略
  • -f 指定密钥文件存储文件名(注:~/.ssh/是密钥目录;id_rsa是密钥名,密钥名可以随意)
  • -C 设置注释文字,比如邮箱(1、这里的C是大写的 2、一定要关联你自己的GitHub的注册邮箱)

接着它会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是GitHub管理者的密码),你也可以不输入密码(推荐),直接按回车。那么push的时候就不需要输入密码,可以直接提交到GitHub上:

Enter passphrase (empty for no passphrase): 
Enter same passphrase again:

如果一切顺利的话,再次进入.ssh目录,你会看到里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的密钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

之后会显示如下提示,表示SSH key已经创建成功:

Your identification has been saved in /c/Users/BLUE/.ssh/id_rsa.
Your public key has been saved in /c/Users/BLUE/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rxneWu2eUcd6M5DKFt2J9aeDZhxpNczajN89HRoqZZg artjay.code@gmail.com
The key's randomart image is:
+---[RSA 2048]----+
| . .o+.oo        |
|. oo. ..ooo o    |
|o+o.+o .oo.+ =   |
|=+ .o.Eo... = .  |
|+    .  S. o .   |
| .    o . o      |
|       B *       |
|      o X *      |
|      .o B..     |
+----[SHA256]-----+

3、生成新的密钥

步骤2中你已经有了一对密钥,现在我们再生成一对新的密钥,并命名为id_rsa_2

ssh-keygen -t rsa -f ~/.ssh/id_rsa_2 -C "artjay.photo@gmail.com"

注意:这里我们只需修改两个地方就行,①新的密钥名为id_rsa_2 ②邮箱账号更换为artjay.photo@gmail.com(你的另一个GitHub账号)

之后可以看到新的SSH key已经创建成功:

Your identification has been saved in /c/Users/BLUE/.ssh/id_rsa_2.
Your public key has been saved in /c/Users/BLUE/.ssh/id_rsa_2.pub.
The key fingerprint is:
SHA256:rxneWu2eUcd6M5DKFt2J9aeDZhxpNczajN89HRoqZZg artjay.photo@gmail.com
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|             o   |
|              =. |
|          o .B=oo|
|        SE +**++=|
|         .+++=+==|
|        ..o=B.=+=|
|       . *o+ o o+|
|        =...+    |
+----[SHA256]-----+

4、更改本地的SSH配置

.ssh文件夹下新建config文件并编辑,另不同的Host实际映射到同一个HostName但密钥不同Host前缀可自定义:

cd ~/.ssh
vim config

上面的命令是在.ssh配置目录(如果不存在)创建一个config文件,并用vim打开编辑。通过vim编辑加入如下配置:

# 第一个ssh密钥(默认)                                                                      
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa


# 第二个ssh密钥                                                                           
Host photo.github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_2

5、将两个密钥对中的id_rsa.pubid_rsa_2.pub里的内容分别加到两个GitHub账号配置下

在本机设置 SSH Key 之后,需要添加到 GitHub上,以完成 SSH 链接的设置。

  • 打开本地 id_rsa.pub 文件( 参考地址C:\Users\BLUE\ .ssh \id_rsa.pub)。此文件里面内容为刚才生成的密钥。如果看不到这个文件,你需要设置显示隐藏文件。准确的复制这个文件的内容,才能保证设置的成功。
  • 登陆 GitHub 系统。点击右上角的 Settings—>SSH and GPG keys —> New SSH key
  • 把你本地生成的密钥复制到里面( key 文本框中),点击 add key 就ok了

6、分别测试两个密钥的ssh链接

ssh -T git@github.com
ssh -T git@photo.github.com

当你输入以上代码时,会有一段警告代码,如:

The authenticity of host 'github.com (52.250.177.223)' can't be established.
RSA key fingerprint is SHA256:rxneWu2eUcd6M5DKFt2J9aeDZhxpNczajN89HRoqZZg.
Are you sure you want to continue connecting (yes/no)?

这是正常的,输入yes回车既可。如果你创建SSH key的时候设置了密码,接下来就会提示你输入密码,如:

Enter passphrase for key '/c/Users/BLUE/.ssh/id_rsa':

密码正确后你会看到下边这句话,表示连接成功:

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

7、克隆新的项目

首先我们先进入GitHub,将克隆方式改为use SSH

一般情况下,我们是通过如下的方式克隆一个项目:

git clone git@github.com:your-account/your-prj.git

在我们有两个密钥的情况下(使用非默认密钥时),我们需要对这个语句中的域名部分做一下修改:

git clone git@xxxx:your-account/your-prj.git

注意:这里的xxxx是你更改本地的SSH配置时(步骤4,第9行)的Host,比如我的:

git clone git@photo.github.com:your-account/your-prj.git

如果你想克隆时指定目录名称:

git clone git@photo.github.com:your-account/your-prj.git DirName

8、取消全局 用户名/邮箱设置,进入项目文件夹单独设置

# 取消全局 用户名/邮箱 配置
git config –global –unset user.name
git config –global –unset user.email

# 为每个仓库单独设置 用户名/邮箱
cd YourRepoPath
git config user.name "You Name"
git config user.email name@example.com
  • 其实很简单,就是去掉--global参数就行了
Jay

谢谢老板~

使用微信扫描二维码完成支付