前面已经把 Hexo 博客部署到 Github Pages 上,但是国内访问 Github 速度不稳定,所以就想着能不能有个工具能够把本地的 hexo 文件直接同步到云服务器呢。

一、电脑运行 rsync 指令

查看官方文档找到 rsync 插件,先实验一下按照文档是否可以部署。

注意此时运行命令都是在 Hexo 的安装文件夹下,后面的一些报错也是跟此有关。

1、安装 hexo-deployer-rsync

1
npm install hexo-deployer-rsync --save
  • 修改配置
1
2
3
4
5
6
7
8
9
deploy:
type: rsync
host: 1.1.1.1 #远程主机地址
user: root #使用者名称
root: root #远程主机的根目录
port: 22
delete: true #删除远程主机上的旧文件
verbose: true #显示调试信息
ignore_errors: false #忽略错误

在 Hexo 中使用 rsync 必须客户端和服务器都装有 rsync。

2、服务器安装 rsync

参考文章:Hexo 中 rsync 的使用

  • 更新系统
1
2
3
apt update
apt list --upgradable
apt upgrade -y
  • 安装 rsync
1
apt install rsync

3、尝试 Hexo 指令部署尝试

1
2
3
hexo clean
hexo g
hexo d

此时系统会报错,因为 windows 系统并没有类似于 rsync 的命令,需要配置。

4、windows 配置 rsync

参考文章:将 Hexo 博客自动部署到服务器

由于 Windows 自身并没有类似于 rsync 的命令,你需要下载和安装 Cygwin,这是一个在 Windows 下提供类 UNIX 环境支持的软件,其中包含了大量 GNU 和开源工具,包括 rsync。

4.1、下载并安装 Cygwin

  • 访问 Cygwin 的官方网站并下载安装程序。

  • 运行下载的 setup-x86.exe(32 位系统)或 setup-x86_64.exe(64 位系统)文件。

  • 在 Cygwin Setup 的包选择界面,输入 rsync 在搜索框中,然后在搜索结果中找到对应的 rsync 包,在 SpinBox 中将 Skip 更改为对应的版本,点击下一步完成安装。

参考文章有时效性,如果此时按文档方法只安装 rsync 没有安装 ssh 后面运行同步命令的时候还是会报错。

4.2、设置 Path 环境变量

  • 右击电脑上的 “此电脑” 图标或者 “My Computer”,选择 “属性” 或者 “Properties”。

  • 在弹出界面中,选择 “高级系统设置” 或者 “Advanced System Settings”。

  • 在 “系统属性” 或者 “System Properties” 窗口中,点击 “环境变量” 或者 “Environment Variables”。

  • 在 “环境变量” 窗口中,系统变量栏找到 Path,点击编辑或者 “Edit”,在变量值的末尾添加 ;C:\cygwin64\bin(64 位系统,32 位系统则添加 ;C:\cygwin\bin),点击 “确定” 或者 “OK”。

参考文章里的方法是比较老的系统了,但是思路是这样的。

4.3、测试 rsync 是否安装成功

  • 打开命令提示符(CMD)或者 Powershell,输入 rsync –version 并按回车。

  • 如果显示 rsync 的版本信息,那么 rsync 已经安装成功。

  • 注意:安装 Cygwin 时可能需要管理员权限。同时也请注意保证 Cygwin 软件包的完整性和安全性,以免引入恶意软件。

需要重启系统,再运行命令才会成功。

5、再次部署

1
2
3
hexo clean
hexo g
hexo d
  • 报错如下
1
2
3
4
5
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(228) [Receiver=3.2.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [sender=3.2.7]
FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html
  • 查询报错信息解决方法

参考文章:为什么这个 rsync 连接在 Windows 上意外关闭?
使用rsync部署Hexo博客-使用远程shell临时启动rsync daemon

因为是使用远程 shell 临时启动 rsync daemon,使用时要求 options 部分必须明确指定 –rsh 选项或其短选项 -e。此时使用 hexo d 指令部署就不行了,需要使用 rsync 指令。

6、rsync 部署

6.1、指令了解

  • 使用 rsync 认证协议进行传输

网上大多数的 rsync 使用教程都是在描述使用 rsync 认证协议进行传输。在传输没有建立之前,这种形式有 server 和 client 的概念,server 端需要启动一个 rsync 守护进程(daemon/service),等待接受 client 发起的连接。一旦连接建立,Client(客户端)/Server(服务器)的这两个角色的差别,就被 Sender(发送者)/Receiver(接收者)所取代。

对于移植到 windows 的 rsync 软件来说,你可能会发现有 server 版本和 client 版本,但是 server 和 client 都是可以主动进行”推送“的。这个概念对于初次接触 rsync 的人员来说比较容易混淆。

使用的命令格式如下

1
2
rsync [options] [user]@[host]::[src] [dest] # 拉取远程文件
rsync [options] [src] [user]@[host]::[dest] # 推送本地文件
  • 使用远程 shell 进行操作

rsync 也支持本地主机借助 ssh 和 rcp 等工具使用远程 shell 和远程主机进行通信。使用这种形式进行传输则不需要任何一方开启守护进程,另外要注意 rsync 本身的配置文件 rsync.conf 并不会在这种形式下起作用。

使用的命令格式如下

1
2
rsync [options] [user]@[host]:[src] [dest] # 拉取远程文件
rsync [options] [src] [user]@[host]:[dest] # 推送本地文件

注意区别在于两个 :: 还是一个 :

  • 使用远程 shell 临时启动 rsync daemon

通过远程 shell 也能临时启动一个 rsync daemon,这不同于使用 rsync 协议,它不要求远程主机上事先启动 rsync 服务,而是临时派生出 rsync daemon,它是单用途的一次性 daemon,仅用于临时读取 daemon 的配置文件,当此次 rsync 同步完成,远程 shell 启动的rsync daemon 进程也会自动消逝。使用时要求 options 部分必须明确指定 –rsh 选项或其短选项 -e

  • rsync 常用参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
-r, --recursive:递归到目录中
-z, --compress 对备份的文件在传输时进行压缩处理
--delete 删除DST中SRC没有的文件
--ignore-errors 忽略IO错误
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
--remove-source-files:要求删除源端已经成功传输的文件
-o, --owner:保持owner属性
-g, --group:保持group属性
--chmod=Dg+s,ug+w,Fo-w,+X 指定传输后的文件权限
语法为[D|F][ugo][+-][rwxs],表示为目录(D)和文件(F)增加(+)减少(-)权限

最常用的选项组合是 avz,即压缩和显示部分信息,并以归档模式传输。另外从 windows 传输到 linux 系统时,控制文件权限的 --chmod 也是非常有用的。

6.2、rsync 指令部署

参考文章:使用 Rsync 从 Windows 同步数据到 Linux

  • 执行命令
1
rsync -e 'C:\cygwin64\bin\ssh.exe -v' -avPz --port 22 cygdrive/C/Users/xxxx/OneDrive/文档/Hexo-Blog/public  root@1.1.1.1:root/data/hexo

还是报错

1
2
rsync: [sender] change_dir "/cygdrive/c/Users/xxxx/OneDrive/文档/Hexo-Blog/Users/xxxx/OneDrive/文档/Hexo-Blog" failed: No such file or directory (2)
rsync: [Receiver] change_dir#3 "/root/root/data" failed: No such file or directory (2)

由上面报错可以看到是路径重复了,文章开头说过,所有指令都是在 Hexo 目录下进行操作,就不需要指定前面的根路径了。

  • 修改指令
1
rsync -e 'C:\cygwin64\bin\ssh.exe -v' -avPz --port 22 public  root@1.1.1.1:data/hexo

最终测试成功,可以进行远程同步,不过这种方法太过麻烦,装了 WSL,可以更方便。

二、WSL 使用 rsync 同步电脑数据到云服务器

2.1、如何使用 WSL 在 Windows 上安装 Debian

  • 以管理员身份运行 CMD

  • 输入以下命令

1
wsl --install -d Debian
  • 重启电脑

2.2、安装 rsync ssh

  • 更新系统
1
sudo apt update && sudo apt upgrade -y
  • 安装 rsync
1
sudo apt install rsync
  • 安装 ssh
1
sudo apt install openssh-server

rsync 默认使用 SSH 进行远程登录和数据传输。 由于早期 rsync 不使用 SSH 协议,需要用 -e 参数指定协议,后来才改的。 所以,-e ssh 可以省略。

2.3、同步指令

在 wsl 运行上面的指令是不能成功的,因为在 wsl 的路径下操作的是 Linux 的文件,并不能访问 windows 的文件,可以使用 /mnt/{Windows盘符} 进入对应盘中进行操作。

  • 进入 C 盘
1
cd /mnt/c
1
rsync -avPz --port 22 Users/xxxx/文档/Hexo/public  root@1.1.1.1:data/hexo

命令运行成功,大功告成。

参考文章:
玩转 WSL 2(三)——Windows 和 Linux 之间的文件操作