使用rsync部署Hexo博客

rsync是linux应用程序,用于文件同步。
cwrsync是适用于windows的rsync软件包,用于windows-windows,或windows-linux之间的文件同步。由itefix开发。

下载

windows下使用cwRsync client。
下载地址: https://www.itefix.net/cwrsync/client

安装结束后,查看rsync、SSH安装路径
where rsync
where ssh

查看rsync版本 rsync --version
查看ssh版本 ssh -V
显示home目录 echo ~

查看cwrsync.cmd,有使用示例可参考。

使用方法

1、-r和-a参数

rsync -r source destination
rsync -a source destination
注意,参数-r-a是必须的。否则rsync source destination无法执行。

其中,
-r 递归复制,包括子目录及其文件;
-a 归档复制,包含文件元信息,包括修改时间,权限等。
由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,
所以直接用-a更好些。

2、路径:驱动器符号

如果source/destination涉及到驱动器盘符,
路径写法: C:/source/ --> /cygdrive/c/source/

3、路径:目录名后带/的含义

将source目录下的所有文件及子目录copy至destination目录下(不包含source目录本身)。
例:rsync -r /cygdrive/source/ /cygdrive/d/destination/
注意source/,表示仅复制该目录下的文件及子目录。

将source目录copy至destination目录下(source目录平移)。
例:rsync -r /cygdrive/source /cygdrive/d/destination/
注意source后没有/,表示source目录将被整体copy至destination目录下。
结果 --> d:\destination\source

4、本地到远程服务器的同步

本地到远程服务器的同步。服务器使用SSH连接。
较复杂的例子:
rsync -av -e "'c:\Program Files\cwrsync_6.4.1_x64_free\bin\ssh.exe' -i ~/.ssh/test.pem" test1/ username@xxx.xxx.xxx.xxx:/var/web/

  • 将test1目录下的文件同步至远程服务器子目录web下。
  • -e 使用ssh登录并指定使用cwrsync自带的ssh文件,避免版本不兼容。
  • ~指当前目录。
  • 路径中有空格,使用单引号括起来。

常用参数

-av参数最常用
例: rsync -av source destination
-a 归档模式。等同于-rlptgoD多个参数集合。
-v 显示同步过程中的详细信息。

参数说明:
explainshell.com - rsync -rlptgoD

rsync 参数
-a 等同于-rlptgoD的多参数集合。
-v --verbose 详细模式。显示同步过程中的详细信息。
-z --compress 压缩传输。减少网络传输数据量。
-n --dry-run 测试连接,不真正复制文件
-p --progress 显示进度

常用的就是-av或-avz

  • a 等价于-rlptgoD; 归档模式。保留文件属性、权限、时间戳等。
    -r --recursive 递归复制;复制包含子目录及子目录下的文件。
    -l --links 创建软连接
    -p --perms 保留权限
    -t --time 同步时间戳
    -g --group 同步组
    -o --owner 保留owner
    -D 保留设备文件和特殊文件。

使用rsync部署Hexo博客

官方文档参见:https://hexo.io/zh-cn/docs/one-command-deployment

步骤

  • 安装hexo-deploy-rsync插件:
    $ npm install hexo-deployer-rsync --save
  • 修改配置
    在_config.yml文件中,找到Deployment部分,做如下修改:
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
  type: rsync
  host: xxx.xxx.xxx.xxx
  user: root
  root: /var/web/
  port: 22
  key: ~/.ssh/key.pem
  args: 
  delete: true
  verbose: true #default is true
  ignore_errors: false  

报错处理

错误:

dup() in/out/err failed
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(232) [sender=3.4.1]

检查所使用rsync和ssh路径。
where rsync
where ssh

若rsync和SSH不兼容,改用cwrsync自带版本。
指定rsync和ssh路径。

修改 Hexo\node_modules\hexo-deployer-rsync\lib\deployer.js

// before
if (args.port && args.port > 0 && args.port < 65536) {
    params.splice(params.length - 2, 0, '-e');
    if (args.rsh) {
      if (args.key) {
        params.splice(params.length - 2, 0, `'${args.rsh}' -i ${args.key} -p ${args.port}`);
      } else {
        params.splice(params.length - 2, 0, `'${args.rsh}' -p ${args.port}`);
      }
    } else if (args.key) {
      params.splice(params.length - 2, 0, 'ssh -i ' + args.key + ' -p ' + args.port);
    } else {
      params.splice(params.length - 2, 0, 'ssh -p ' + args.port);
    }
  }
  
// after
if (args.port && args.port > 0 && args.port < 65536) {
    params.splice(params.length - 2, 0, '-e');
    if (args.rsh) {
      if (args.key) {
        params.splice(params.length - 2, 0, `'${args.rsh}' -i ${args.key} -p ${args.port}`);
      } else {
        params.splice(params.length - 2, 0, `'${args.rsh}' -p ${args.port}`);
      }
    } else if (args.key) {
      params.splice(params.length - 2, 0, '"D:\\Program Files\\cwrsync_6.4.1_x64_free\\bin\\ssh" -i ' + args.key + ' -p ' + args.port);
    } else {
      params.splice(params.length - 2, 0, 'D:\\cwrsync_6.4.1_x64_free\\bin\\ssh -p ' + args.port);
    }
  }

注意事项

pem文件路径。必须在~/.ssh/xxx.pem
私钥不设密码。若设密码,windows下密码弹窗有几率无法弹出导致失败。