建新hexo博客后继续更新旧hexo博客的方法
我创建了一个新的 github 账号 ChangingSelf(憧憬少)来搭建新的博客,旧的博客搭建在旧账号 HaneChiri(羽尘)上,原本的博客已经有一些人知道了,所以我用这个方式来将以前的访客带到我的新博客来。
问题在于,为了部署新博客,我将原本的 ssh 密钥对文件删掉了,重新生成了新的 ssh,现在想要部署旧博客就会出现类似下面的错误:
1 | ERROR: Permission to HaneChiri/HaneChiri.github.io.git denied to ChangingSelf. |
大意是我没有权限,也就是 ssh 没有配好。
参考链接
- github 支持多个账号
- SSH-keygen 用法
- git 配置多个 SSH-key
- git 配置多个 SSH-key-多图易理解版
- 配置多个 ssh 密钥对并且永久多 ssh 管理
- 是否必须每次添加 ssh-add
- 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 | ERROR: Permission to HaneChiri/HaneChiri.github.io.git denied to ChangingSelf. |
也对,现在有两个密钥对,可能是配对错误了。
仔细看错误内容,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 | Host github.com |
字段 | 说明 |
---|---|
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 |
果然没这么简单。找解决方法,也就是上文我写的那些。
建新hexo博客后继续更新旧hexo博客的方法
https://yxchangingself.xyz/posts/update_old_hexo_blog_after_build_new_hexo_blog/