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 | // 切换到.ssh目录下 |
2 | $ cd ~/.ssh |
3 | // 输入你的邮箱创建新的ssh key,git唯一认证标准是邮箱 |
4 | ssh-keygen -t rsa -C "example@mail.com" |
5 | // 输入新的名称,默认为id_rsa,此处我们设置为id_rsa_work |
6 | Enter file in which to save the key (/Users/Paul/.ssh/id_rsa): id_rsa_work |
7 | // 设置密码 |
8 | Enter passphrase (empty for no passphrase): |
9 | 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 | $ cd ~/.ssh |
2 | touch config |
修改其配置,我的配置如下
1 | Host Paul_work |
2 | HostName github.com |
3 | User git |
4 | IdentityFile ~/.ssh/id_rsa_work |
5 | |
6 | Host Paul |
7 | HostName github.com |
8 | User git |
9 | IdentityFile ~/.ssh/github_rsa |
Host是新建的github的别名,不是你github上的用户名,也不是邮箱。是待会克隆时候用来匹配密钥用的别名。比如Paul这个host就是默认为github.com的host,为了方便区分个人用和工作用github,我使用了两个别名
5、应用
1 | $ git clone Paul_work:Kinpzz/modern_web.git |
2 | Cloning into 'modern_web'... |
3 | remote: Counting objects: 6, done. |
4 | remote: Compressing objects: 100% (2/2), done. |
5 | remote: Total 6 (delta 0), reused 3 (delta 0), pack- reused 0 |
6 | Receiving objects: 100% (6/6), done. |
7 | 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 | \# 此命令可以将git add和git commit合成一步要添加上更新说明 |
2 | $ cd ~/modern_web |
3 | \# 看到下列的提示表明是一个git项目 |
4 | modern_web git:(master) ✗: git commit -am "test" |
5 | Your name and email address were configured automatically based |
6 | on your username and hostname. Please check that they are accurate. |
7 | |
8 | You can suppress this message by setting them explicitly: |
9 | git config --global user.name "Your Name" |
10 | git config --global user.email you@example.com |
11 | |
12 | After doing this, you may fix the identity used for this commit with: |
13 | |
14 | git commit --amend --reset-author |
15 | |
16 | 1 file changed, 1 insertion(+), 1 deletion(-) |
但是却出现了如上的报错提醒,这是为什么呢?在remote pull push commit的时候都可能会出现这个问题。原因就在于我们使用了两个github账户,两个邮箱。自然不能使用global的user.email。因此我们应该进一步配置git的config文件。git为我们提供了配置的方法。
1 | \#取消global |
2 | git config --global --unset user.name |
3 | git config --global --unset user.email |
4 | \#为每一个项目设置自己的user.email |
5 | git config user.email "example@email.com" |
6 | 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 | $ git push |
2 | Writing objects: 100% (3/3), 262 bytes | 0 bytes/s, done. |
3 | Total 3 (delta 0), reused 0 (delta 0) |
4 | To Paul_work:Kinpzz/modern_web.git |
5 | 46feb38..93f5f41 master -> master |
接下来就可以开心的push啦!
ps:本过程是在macbook下进行 mac osx 10.10.5,推荐终端iterm2,推荐shell:zsh、myzsh
参考资料
2、git.md
3、多github账号的SSH key切换(缺少对git config的配置)