同一设备多个git账号的ssh管理

2016.12.31日更新

起因

自己使用hexo在github上搭建了个人的静态博客,最近由于学习modern web programing 需要在github上保存作业。于是想要将自己私人的资料与学习工作上的资料分在两个github账号进行保存。为了方便管理,开始google资料对多账号的ssh key进行管理。在此过程中,也遇到了一些苦难,但最终成功。整理、分享自己的方法。

什么是ssh?

ssh是Secure Shell (安全外壳协议)来得比传统的ftp、pop、telnet等使用明文传送口令和数据的协议来的更加安全。ssh提供两种级别的安全验证。一种是基于口令的安全验证,传输过程中的数据会被加密。但是不能保证自己正在连接的服务器就是自己想要连接的服务器。另一种是基于密钥的安全验证。通过创建两把密钥,一把公用密钥放在服务器上,一把私用密钥放在自己的设备上。通过密钥的匹配来保障自己所连接的网站是自己想要访问的,同时保障自己在这个网站的信息不因为丢失账号密码而泄漏。免去了输入口令的麻烦。在此次github中,我用的是第二种验证方式。

步骤

1、创建新的ssh key,以下操作在终端中进行
1
2
3
4
5
6
7
8
9
// 切换到.ssh目录下
$ cd ~/.ssh
// 输入你的邮箱创建新的ssh key,git唯一认证标准是邮箱
ssh-keygen -t rsa -C "example@mail.com"
// 输入新的名称,默认为id_rsa,此处我们设置为id_rsa_work
Enter file in which to save the key (/Users/Paul/.ssh/id_rsa): id_rsa_work
// 设置密码
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

在该步骤中要注意切换到.ssh目录下进行该操作,由于忘记切换到该目录下,自己多花费了许多功夫和时间,因为在设置名称的时候绝对路径无法访问到.ssh文件夹里面,.ssh为系统隐藏的文件夹。

2、添加私用密钥添加到ssh agent

通过ssh agent对密钥的管理我们可以实现免密码push到github。

1
2
\#添加之前所新生成的**私用密钥**
$ ssh-add ~/.ssh/id_rsa_work

在这一步中,要注意添加的是私用密钥,才能成功与自己放在服务器上的公用密钥进行匹配。

3、添加公用密钥到github账户
1
2
\#复制公用密钥的内容,可以手动复制
$ pbcopy < ~/.ssh/id_rsa_work.pub

后续的步骤可以参见github教程中Step4之后的详细教程。

4、配置config文件

在~/.ssh目录下找到config文件,若没有找到进行创建

1
2
$ cd ~/.ssh
touch config

修改其配置,我的配置如下

1
2
3
4
5
6
7
8
9
Host Paul_work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
Host Paul
HostName github.com
User git
IdentityFile ~/.ssh/github_rsa

Host是新建的github的别名,不是你github上的用户名,也不是邮箱。是待会克隆时候用来匹配密钥用的别名。比如Paul这个host就是默认为github.com的host,为了方便区分个人用和工作用github,我使用了两个别名

5、应用
1
2
3
4
5
6
7
$ git clone Paul_work:Kinpzz/modern_web.git
Cloning into 'modern_web'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 3 (delta 0), pack- reused 0
Receiving objects: 100% (6/6), done.
Checking connectivity... done.

好了,克隆成功。此处Paul_work就是使用id_rsa_work这个密钥来配对的github.com,Kinpzz是指的这个网站下的目录,用户名Kinpzz中的modern_web的repository。因此注意Paul_work:后不再添加https://github.com/

同理,如果需要将github上的一个远程仓库,和本地仓库进行同步的话。同样适用Paul_work来代替便可以适用ssh进行验证。

1
git remote add origin Paul_work:xxx/xxx.git
6、测试

修改modern_web这个项目中的readme.md文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
\# 此命令可以将git add和git commit合成一步要添加上更新说明
$ cd ~/modern_web
\# 看到下列的提示表明是一个git项目
modern_web git:(master) ✗: git commit -am "test"
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config --global user.name "Your Name"
git config --global user.email you@example.com
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
1 file changed, 1 insertion(+), 1 deletion(-)

但是却出现了如上的报错提醒,这是为什么呢?在remote pull push commit的时候都可能会出现这个问题。原因就在于我们使用了两个github账户,两个邮箱。自然不能使用global的user.email。因此我们应该进一步配置git的config文件。git为我们提供了配置的方法。

1
2
3
4
5
6
\#取消global
git config --global --unset user.name
git config --global --unset user.email
\#为每一个项目设置自己的user.email
git config user.email "example@email.com"
git config user.name "your_name"

注意每一个项目repo都会有自己的git配置文件,所以我们在进行上述操作的时候要确保进入该项目目录下

2016.12.31日更新:
这个方法的缺点就是,之后每创建一个git的仓库,在本地生成的git仓库,都要设置一遍user和email,比较麻烦。email和user关系到了在github上所显示的commiter。

初次运行 Git 前的配置
可以知道,本地的设置应该是可以覆盖全局的设置的。此处我们要把ssh的email与git的email概念分开,ssh的email在这里基本上不会用到。git的email和user关系到了commiter。这种方法在使用git push的时候不会出现问题,但是在使用hexo deploy的时候会出现比较大的问题,原因就是hexo deploy的email的配置调用的是global下的参数所导致的。所以如果要使用hexo deploy而不是传统的git push的话,需要通过hexo的config.yml来进行修改。具体见hexo #2125
#45。经过尝试发现是自己在配置ssh-add的时候,private key出现了一些问题,以及config上出现错误。尝试使用ssh-add -D清空私钥,然后再来进行下面的方法验证。可以发现可以通过不同的账号来进行登录和push了。但是上述的问题还没有解决,hexo d所读取到的仍然是global的变量。

测试ssh连接方法

通过下面指令来测试连接情况。能顺利进行连接代表有权限来进行commit。但是github识别commiter的方法是识别git config里的邮箱来判断commiter是谁的。

1
ssh -T git@Paul // host
1
2
3
4
5
$ git push
Writing objects: 100% (3/3), 262 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To Paul_work:Kinpzz/modern_web.git
46feb38..93f5f41 master -> master

接下来就可以开心的push啦!

ps:本过程是在macbook下进行 mac osx 10.10.5,推荐终端iterm2,推荐shell:zsh、myzsh

参考资料

1、Generating SSH keys

2、git.md

3、多github账号的SSH key切换(缺少对git config的配置)

您的支持将鼓励我继续创作!