使用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下密码弹窗有几率无法弹出导致失败。