0%

免密码远端部署Hexo到GitHub(使用SSH Key)

步骤

  1. 实现思路
  2. 开始配置
  3. 使用脚本简化远端部署步骤

实现思路

  • 用《使用Hexo搭建博客》一文中部署到GitHub的方法,每次将生成的静态文件页面push到GitHub的仓库时,都需要输入GitHub用户名以及密码(或者token),比较繁琐。因此,我们可以使用SSH公钥认证来免输入密码部署。
  • SSH Key,公钥认证,是使用一对加密字符串,一个称为公钥(public key),任何人都可以看到其内容,用于加密;另一个称为密钥(private key),只有拥有者才能看到,用于解密。通过公钥认证可实现SSH免密码登陆,git的SSH方式就是通过公钥进行认证的。
  • 也就是说,我们在自己的电脑上生成一对key,把其中的public key配置到git服务器的项目上,private key在自己的电脑上配置好,这时就可以在自己的电脑上往git服务器上的那个项目提交代码了。当然,前提是git服务器上的项目接受了你的公钥(一般情况下,都是自己的仓库所以这一步没有问题)。

开始配置

  • 这里默认是同一台Mac,配置多个SSH Key。(注意:以下操作终端用户为root,如果不是root用户,显示会不太一样,但操作都是相同的)

    1. 打开终端,生成一个SSH Key

      1
      $ ssh-keygen -t rsa -C "youremail@xxx.com"
    2. 按下回车后:

      1
      2
      3
      4
      5
      6
      Generating public/private rsa key pair.
      Enter file in which to save the key (/var/root/.ssh/id_rsa): /var/root/.ssh/id_rsa_blog_github(自己取名字)
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in id_rsa_blog_github
      Your public key has been saved in id_rsa_blog_github.pub

      最好每次生成时都给SSH Key取个名字,这样后面在管理时自己也一目了然。这里我所用的格式是id_rsa_项目名_git提供方,我生成的所有key都遵循这个规则命名。建议你也有你自己的一种命名方式,并且保持统一。如果不取名字,默认的是id_rsa,如果后面生成时不命名,会把这个覆盖掉。密码可以不设置,免得每次提交时还要输入一次,安全性自己衡量吧。第一次生成key时,会在~目录下创建一个.ssh目录。

    3. 进入~/.ssh目录

      1
      2
      $ cd ~/.ssh
      $ ls
    4. 将key加入到ssh-agent

      1
      2
      3
      $ ssh-add -l # 显示ssh系统代理中所有的key
      $ ssh-add -K ~/.ssh/id_rsa_blog_github # 将新生成的key加入到ssh-agent中,参数-K是将SSH Key导入到密钥链中,这样系统重启时也不会“忘记”这个密钥。
      $ ssh-add -l # 也可以用来查看添加结果
    5. 将公钥加入到github对应的项目的Deploy keys中

      1. 复制id_rsa_blog_github.pub里面的内容

      2. 打开GitHub对应的项目仓库,依次选择Settings->Deploy keys->Add deploy key

      3. 将复制的内容放入GitHub中

    6. 创建本地的配置文件~/.ssh/config,编辑如下

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      # 一个SSH Key
      Host blog.github.com
      HostName github.com
      User git
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/id_rsa_blog_github

      # 另一个SSH Key
      Host conference.github.com
      HostName github.com
      User git
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/id_rsa

      注意:

      1. Host的名字可以随便取,这里的规则是项目名.git服务器源,接下来会用到这个名字,测试是否配置正确

        1
        $ ssh -T git@blog.github.com # (Host的名字)
      2. 连接成功,会显示;

        1
        Hi VKortki/VKortki.github.io! You've successfully authenticated, but GitHub does not provide shell access.
    7. 问题来了,如果我们建立了多个博客对应多个仓库,为此我们也创建了多个SSH Key,某个博客(或仓库)怎么才能知道其对应的SSH Key呢?这时Host的名字也起到很大的作用。

      1. 进入博客所在目录

        1
        $ cd /你建的博客站点所在的目录
      2. 修改站点的_config.yml

        1
        $ vim _config.yml
      3. 修改如下内容_config.yml

        1
        2
        3
        4
        5
        6
        7
        # Deployment
        ## Docs: https://hexo.io/docs/one-command-deployment
        deploy:
        type: git
        repo: git@blog.github.com:Vkortki/Vkortki.github.io.git
        # repo: git@Host的名字:用户名/仓库名.git
        branch: master

使用脚本简化远端部署步骤

  1. 进入博客所在目录

    1
    $ cd /你建的博客站点所在的目录
  2. 创建deploy.sh脚本文件

    1
    2
    $ touch deploy.sh
    $ vim deploy.sh
  3. 将如下内容粘贴到脚本文件中并保存

    1
    2
    3
    4
    5
    6
    7
    8
    #!
    echo "Start deployment"
    hexo clean
    hexo generate
    hexo deploy
    echo "Finish"
    echo 按任意键继续
    read -n 1
  4. 需要部署时,运行命令

    1
    $ sh deploy.sh