如何生成多个ssh并将hexo博客布置到github

昨天是我好朋友的生日。她是一个写东西特别好的人。我一直觉得她写作的才华特别赞。所以就给也用hexo搭建了个博客。我给她申请了个github账号。这就有一个问题:我必须要再生成一个ssh公钥和密钥才能够控制她的github。

生成新的公钥和密钥


生成新的公钥

1
$ ssh-keygen -t rsa -C "your-email-address"

注意这里不能一直按enter键,否则会覆盖原来我的ssh。
当出现下面的第一行时,要输入新的ssh的地址并且命名。如下就是将id_rsa_aaa保存在了root/.ssh/下,并命名为id_rsa_aaa。注意window目录下不是root,你要找到你相应的.ssh的地址。如/c/users/username/.ssh/

1
2
3
4
Enter file in which to save the key (/root/.ssh/id_rsa):/root/.ssh/id_rsa_aaa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa_aaa.

输入后就生成了一个新的ssh。


将公钥拷贝到github

这时候需要进入github的settings里面的ssh。并把生成的公钥复制到对应的栏目里。直接vi id_rsa_aaa.pub,就可以编辑复制。


加入ssh agent上

把该key加到ssh agent上。由于不是使用默认的.ssh/id_rsa,所以你需要显示告诉ssh agent你的新key的位置

1
$ ssh-add ~/.ssh/id_rsa_aaa

这时,你可能会报一个错:

1
Could not open a connection to your authentication agent

此时先执行 eval ssh-agent(是~键上的那个)再执行 ssh-add ~/.ssh/id_rsa_aaa就可以成功。下面可解释原因。

SSH private-keys are usually stored encrypted on the computers they are stored on. A pass-phrase is used to decrypt them when they are to be used. Since most people use SSH public-private key-pairs to get around typing in passwords all the time, the ssh-agent daemon exists to store decrypted private-keys you plan on using in a given session. The thing most people get tripped up on when using ssh-agent is that what the program outputs, some borne or csh shell commands, needs to be run. It may look like ssh-agent has set some variables for you, but it has in fact done no such thing. If you call ssh-add without processing ssh-agent’s output, it will complain it is unable to open a connection to your authentication agent. The most straightforward way to run ssh-agent on the command line is as follows: eval ssh-agent. After doing this, calls to ssh-add should succeed without error.

可以通过下面的命令测试是否生成ssh成功:

1
2
3
4
//检测原来的github账号的ssh是否设置成功
ssh -T git@github.com
//检测新的ssh是否设置成功
ssh -T git@github_aaa.com


配置config文件

.ssh下面本来是没有config文件,因为默认你的电脑就只有一个github与本地关联。但由于此时有多个github和对应的ssh,所以必须要配置才能加以区分。进入$ vi .ssh/config。并加入下列内容。保存后退出。

1
2
3
4
5
6
7
8
9
# 加上以下内容
#default github
Host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa

Host github_aaa.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_aaa


如何使用

这样的话,你就可以通过使用github.com别名github_aaa来明确说你要是使用id_rsa_aaa的SSH key来连接github,即使用工作账号进行操作,如下:

1
2
3
4
5
6
#本地建库
$ git init
$ git commit -am "first commit'
#push到github上去
$ git remote add origin git@github_aaa.com:xxxx/test.git
$ git push origin master

由于我是要把hexo博客部署到github上,所以方式有所不同,更改_config.yml文件:

1
2
3
4
deploy:
type: git
repository: git@github_aaa.com:zxqblog/zxqblog.github.io.git
branch: master

如上,上面的@后面不是github.com而是我们刚刚起的别名,github_aaa.com。注意这里的type要写成git而不是默认的github,否则会报下面的错:

1
error deployer not found:github

这是由于hexo 更新到3.0之后,deploy的type 的github需要改成git。


部署hexo博客到github

首先新建一个仓库

如:zxqblog.github.io。最好是以这种形式命名。Github Pages的Repository名字是特定的,比如我Github账号是cnfeat,那么我Github Pages Repository名字就是cnfeat.github.io。


部署仓库

使用命令

1
2
3
hexo clean
hexo generate
hexo deploy


在部署的过程中你可能会出现以下的几个问题:

问题1 Error: spawn ENOENT 错误信息解决方案

解决方法就是在cmd下敲的命令无法实现,我们把命令在git shell下面敲打就可以实现了。或者配置环境变量如:C:\Program Files (x86)\Git\bin;C:\Program Files (x86)\Git\libexec\git-core,这样就解决了问题了。

问题2 页面一直显示 404 page 解决方案

在github部署完成之后,马上访问可能出现404错误,这是正常的,(最多)等待十分钟左右就可以访问了。如果还不行,那很可能是 github 发送给你的验证邮件你没有打开看,据多方反映,验证后就没问题了。或者是验证邮箱里会出现deploy false的现象,并告诉你部署不成功的原因。这时候你去检查文件,再查找原因即可。

问题3 Page build failed: Missing submodule的解决方案

这个问题我犯的真的很低级。因为以前都是通过阿里云来部署我的网站。以为github page部署hexo是一样的,于是就用先前的:git init,git add,git commit,git remote add,git push来做。

但后来知道github page部署hexo不需要这样,只需要上面的步骤配置好_config.yml文件即可。造成这个错误的原因有很多。但是我的错误的大概原因是git里面又有git。或者是git文件不正确(不一定理解正确。。。)。解决方法是重建仓库,查到以前有人用:

- Make a backup of the content locally
- Delete the repository from GitHub
- Delete the repository locally
- Recreate the repository, ensuring that you don't include the repository within the repository locally, which is what you did previously
- Push it to GitHub

这个方法解决了,其实就是重新建了仓库。简单的方法是把原来blog里的所有git全部删除,包括deploy_git。然后把github上的文件全部清空。只保留库名字。然后再deploy即可。


涨知识

什么是SSH

SSH是一种网络协议,用于计算机之间的加密通信。


公钥Public Key与私钥Private Key

SSH需要生成公钥Public Key和私钥Private Key, 常用的是使用RSA算法生成id_rsa.pub和id_rsa。 公钥Public Key(id_rsa.pub)是可以暴露在网络传输上的,是不安全的。而私钥Private Key(id_rsa)是不可暴露的,只能存在客户端本机上。

所以公钥Public Key(id_rsa.pub)的权限是644,而私钥Private Key(id_rsa)的权限只能是600。如果权限不对,SSH会认为公钥Public Key(id_rsa.pub)和私钥Private Key(id_rsa)是不可靠的,就无法正常使用SSH登陆了。

同时在服务端会有一个~/.ssh/authorized_keys文件,里面存放了多个客户端的公钥Public Key(id_rsa.pub),就表示拥有这些Public Key的客户端就可以通过SSH登陆服务端。


SSH公钥登陆过程

  1. 客户端发出公钥登陆的请求(ssh user@host)
  2. 服务端返回一段随机字符串
  3. 客户端用私钥Private Key(id_rsa)加密这个字符串,再发送回服务端
  4. 服务端用~/.ssh/authorized_keys里面存储的公钥Public Key去解密收到的字符串。如果成功,就表明这个客户端是可信的,客户端就可以成功登陆

由此可见,只要多台电脑上的的公钥Public Key(id_rsa.pub)和私钥Private Key(id_rsa)是一样的,对于服务端来说着其实就是同一个客户端。

所以可以通过复制公钥Public Key(id_rsa.pub)和私钥Private Key(id_rsa)到多台电脑来实现共享登陆。


总结

进一步了解了SSH,并且也知道github page怎么部署网站。最后还选了一个好看的主题。希望她会喜欢。可以访问看看,她的文章写得好好。地址