如何生成多个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怎么部署网站。最后还选了一个好看的主题。希望她会喜欢。可以访问看看,她的文章写得好好。地址