建新hexo博客后继续更新旧hexo博客的方法

我创建了一个新的 github 账号 ChangingSelf(憧憬少)来搭建新的博客,旧的博客搭建在旧账号 HaneChiri(羽尘)上,原本的博客已经有一些人知道了,所以我用这个方式来将以前的访客带到我的新博客来。

问题在于,为了部署新博客,我将原本的 ssh 密钥对文件删掉了,重新生成了新的 ssh,现在想要部署旧博客就会出现类似下面的错误:

1
2
3
ERROR: Permission to HaneChiri/HaneChiri.github.io.git denied to ChangingSelf.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights `

大意是我没有权限,也就是 ssh 没有配好。

参考链接

解决方案

目前状况

操作系统是 win10(找到的资料很多 linux 的,不过没关系,有 git-bash)

github 上有两个账号,一个旧账号(HaneChiri),一个新账号(ChangingSelf)。本地有两个 hexo 博客源代码文件夹,分别对应两个账号上搭建的博客。

本地C:\Users\Administrator\.ssh文件夹内有:

  • id_rsa.pub:公钥文件,已添加到 ChangingSelf 账号的 ssh-key
  • id_rsa:私钥文件
  • known_hosts

现在在 ChangingSelf 博客文件夹内使用hexo d部署博客,可以部署到对应账号的仓库,而在 HaneChiri 博客文件夹内部署博客,则权限不足。

(现在回想起来也许直接将现在新的公钥添加到旧账号中就搞定了呀,搞那么麻烦 QAQ,等写完这篇文再试试这个方法)

过程复盘

生成新密钥对

先来看看百度百科关于 SSH(安全外壳协议)的介绍:

从客户端来看,SSH 提供两种级别的安全验证。

第一种级别(基于口令的安全验证)

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密匙的安全验证)

需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到 SSH 服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要 10 秒 [2] 。

我们现在弄的就是第二种,基于密钥的安全验证。本地创建一个密钥对,将公钥放在 github 服务器上,本地保留私钥。

首先,打开 git-bash,生成新的 ssh 密钥对:

1
$ssh-keygen -t rsa -C "youremail@xxx.com" -f keyfileName
参数 说明
-t 生成的密钥类型,默认 rsa
-C 注释文字,应该不会影响密钥内容,这里设置成邮箱
-f 指定密钥文件名,默认为 id_rsa

由于.ssh 目录下已经存在默认文件名的密钥,所以换一个名字。我想要生成旧账号 HaneChiri 的密钥,所以文件名就起名为id_rsa_hanechiri,当然,这个并无影响。

最后会生成两个文件,.pub 后缀的是公钥,另一个是私钥。

添加公钥到 github 账号

在网页右上角账号设置中找到 SSH key,添加公钥文件的内容即可,添加过程很简单,不详细叙述。

添加完毕后再次部署 HaneChiri 的博客,发现仍然是这个错误:

1
2
3
ERROR: Permission to HaneChiri/HaneChiri.github.io.git denied to ChangingSelf.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights

也对,现在有两个密钥对,可能是配对错误了。

仔细看错误内容,HaneChiri 库拒绝了用户 ChangingSelf 的访问,也就是说,用的是 HaneChiri 的公钥,与新账号 ChangingSelf 的私钥,难怪无法配对了。因此我们需要改变私钥的选择。

改变使用的私钥

我查到的参考博客里面基本上都说要使用ssh-add命令来将私钥添加管理,不过我后来发现,这个添加并不是永久保存,而是添加到 ssh-agent 的高速缓存中,我打开另一个 git-bash 的时候就不行了(参考:是否必须每次添加 ssh-add

临时性保存

打开 ssh-agent 服务,即输入命令:

1
$ssh-agent bash

然后添加私钥:

1
$ssh-add C:/Users/Administrator/.ssh/id_rsa_hanechiri

这里的地址是需要使用的私钥文件的绝对地址。

可以通过-l 选项查看所有已经添加的私钥:

1
$ssh-add -l

使用-D 选项清空私钥列表:

1
$ssh-add -D

接着在这个 git-bash 里面来操作就行了(如果退出就得再弄一次),此时用hexo d命令部署,就部署成功了。

永久性保存

需要永久保存私钥的选择,则需要一个配置文件 config,这个文件长这样:

1
2
3
4
5
Host github.com
HostName github.com
IdentityFile C:/Users/Administrator/.ssh/id_rsa_hanechiri
PreferredAuthentications publickey
User HaneChiri
字段 说明
Host 网站别名,最好和 HostName 一致
HostName 网站域名
IdentityFile 私钥文件的绝对路径
PreferredAuthentications 验证方式,填 publickey 就是公钥验证
User 用户名

可以配置多个网站,每个网站都有上面这些字段。在你使用 ssh 访问这个文件内存在的某个网站时,ssh 就会拿这个文件里面指定的私钥来进行验证。

在.ssh 目录下找,如果存在这个名为config的文件,就打开来编辑,没有的话就新建一个。

配置好文件之后,打开 git-bash 再使用hexo d就搞定部署了。

由于我只是需要临时将博客地址转移的公告发上旧博客,使用临时的方法就好了。(不过我是先用了 config 文件的方法,写本文时才尝试临时性的方法,成功了)

最后做个试验

最后再来试试我写本文时,对 ssh 更加了解之后,才想到的简便方法:直接把新账号 ChangingSelf 的公钥添加到旧账号的 ssh-key 中。

结果给我显示:

1
Key is already in use

果然没这么简单。找解决方法,也就是上文我写的那些。

作者

憧憬少

发布于

2020-01-28

更新于

2020-01-28

许可协议