从 Windows 向 Linux 进行 Rsync 操作

前言

这篇博客早该写了,但因为期末周比较忙所以还是留到现在才写。
本博客是使用 hexo 构建,使用其插件部署到服务器的。一开始用 sftp 部署,但是其效率真的太低了,而且还容易因为网络问题卡住,所以我折腾了一下 rsync 部署。

rsync 是一个可以在 ssh 协议上运作的用于同步文件的实用工具,并且有增量更新的功能。

基本配置

主要的问题在于,虽然和服务器的连接成功建立了,但是 rsync 客户端和服务器之间的通信却失败了。
错误信息大抵如下:

1
2
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(231) [Receiver=3.2.7]

经过我一番测试,发现其原因可能在于 Windows 和 Linux 下管道或者字节流的细微不同。总之,只需要使用 rsync 配套的 ssh,就没有问题了。我使用 chocolatey 安装的 rsync,因此也应使用附带的 ssh 搭配操作。在 Hexo 的 _config.yml 中设置 rsh 项为对应的 ssh 可执行文件(用 Windows 风格的反斜杠路径)即可。然后,因为 chocolatey 安装的 rsync 是由 cygwin 提供的,要使用 cygdrive 风格的路径指定 ssh 密钥,如:/cygdrive/盘符/目录/../文件。 而且,密钥的(OpenSSH)版本不能太新,似乎只能用 RSA 4096 了,需注意。
配置好后,实际上我们的电脑还未信任远程机器,而附带的 ssh 默认的 known_hosts 需要管理员权限才能写入,因此要以管理员权限先运行特供 ssh 连接到远程主机一次,才能开始使用。

专门配置

本博客采用了特殊的安全方案,为部署博客提供了专门的账号来写入网站路径,并且设置了 chroot,防止其他文件受到影响。可以在 sshd_config 中 Match 特定用户,然后通过 ChrootDirectory 配置项设置 ssh 后的强制 chroot 路径。需要注意的是 chroot 路径只能为 root 所有,而且权限必须是仅 root 可写,子目录可以是其他权限方案。设置好 chroot 后,复制 shrsync 到 chroot 的目录下,利用 ldd 协助补全动态链接库,即可实现与本博客相同的配置方案:D。