rsync教程

mac 升级 rsync

mac自带rsync在/usr/bin/rsync,版本 rsync version 2.6.9 protocol version 29太老,不支持用一条命令将多个远程文件传到本地,需要升级才支持。

升级方法:

brew install rsync

安装在/usr/local/bin/rsync,版本rsync version 3.1.3 protocol version 31

用法

rsync (参数)  <> <>

源/收路径写法

源\得\收 已有文件夹(/) 已有文件夹/新建名[1] 已有文件夹/新建名/ 已有文件夹(/(新建文件夹(/)) 下有同名文件(夹)
一个文件 已有文件夹/同名文件 已有文件夹/新建名 文件重命名了 已有文件夹/新建名/同名文件 覆盖原同名文件
一个文件夹 已有文件夹/同名文件夹 已有文件夹/新建名/同名文件夹 同左 覆盖原同名文件
多个文件(夹) 已有文件夹/多个同名文件(夹) 已有文件夹/新建名/多个同名文件(夹) 同左 覆盖原同名文件

源文件(夹)的特殊写法

  • 源文件夹 则得到 接收文件夹/源文件夹
  • 源文件夹/ 则得到 接收文件夹/源文件夹下所有的文件(包括隐藏文件)
  • 源文件夹/* 则得到 接收文件夹/源文件夹下所有非隐藏文件

远程文件的写法

  • 服务器 单独写不可以,一定要有:
  • 服务器:(.(/)) 拷贝到 服务器:/home/$USER
  • 服务器:(./)路径 拷贝到 服务器:/home/$USER/路径

多个远程文件

  • 多个远程文件(夹)传到本地:rsync (参数) 服务器1:源1路径 :源2路径 服务器2:源3路径 本地接受目录
    • 服务器1:源1路径 :源2路径 表示 服务器1:源1路径 服务器1:源2路径
    • 服务器:源路径可以含有{xx,xx,xx}用以表示多个路径
    • 本地接受目录只能写一个
  • 本地文件(夹)传到多个远程文件(夹):目前 rsync 不支持 (目前版本为rsync version 3.1.3 protocol version 31)。prsync 支持这个,详见下prsync

默认参数

rsync 会使用 /etc/ssh/ssh_config~/.ssh/config ,支持ssh跳板机连接

rsync -aHhvzP 本地路径1 (本地路径2 ...)  服务器别名:远程路径
rsync -aHhvzP 本地路径1 (本地路径2 ...)  用户名@ip:远程路径 -e 'ssh -p 端口'
rsync -aHhvzP 服务器别名:远程路径1 (:远程路径2...)  本地路径
rsync -aHhvzP -e 'ssh -p 端口' 用户名@ip:远程路径1 (:远程路径2...)  本地路径
-a 					归档模式 = -rlptgoD
    -r 				递归目录
    -l				保留软链接	   # scp 无论什么参数都做不到,所以不推荐用scp,而用rsync
    -p				保持文件权限
    -t				保持修改时间
    -g				保持文件属组信息
    -o				保持文件属主信息
    -D 				= --devices --specials
    --devices  保留设备文件 (此命令需要sudu权限)
  --specials 保留特殊文件
-H 					保留硬链接
-h					kMG B计文件大小
-v          详细模式输出
-z 					压缩传输
-P          = --partial --progress
    --partial   保留没传完的文件,支持断点续传
    --progress  进度条
--partial-dir=何处保存没传完的文件

封装成alias

按如下方法封装,zsh下,输入autots函数、ts(alias),按tab,能得到和rsync一样的本地目录和远程目录的自动补全

# 自动端点续传,传送失败后隔180秒自动重新连接

# autots(alias)会被下面的autots函数覆盖,用来使得下面的autots函数能够和rsync一样自动补全本地和远程目录
alias autots='rsync'
function autots {
    local retry_time=180 # second
    while [ 1 ]
    do
        rsync -aHhvzP $*
        # command 调用系统的 rsync 命令,避免递归调用rsync
        if [ "$?" = "0" ] ; then
            echo "rsync completed normally"
            break
        else
            echo "Rsync failure. Backing off and retrying in $retry_time seconds..."
            sleep $retry_time
        fi
    done
}
# rsync 封装多种参数,但不支持断点续传; ts能够和rsync一样自动补全远程目录
alias ts='rsync -aHhvz --progress'

报错

protocol version mismatch

若远程主机的登录文件( 如.bash_profile)中有stdout输出(即echo "xxxx"echo "xxx" >&1),则在用rsync与远程主机传输文件(不论上传、下载),均会报错如下,且无法传输文件。

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(185) [sender=3.1.3]

将stdout输出改为stderr输出(即echo "xxx" >&2),则此报错消失

参考阅读

zsh的自动补全

https://mads-hartmann.com/2017/08/06/writing-zsh-completion-scripts.html

https://github.com/zsh-users/zsh-completions/blob/master/zsh-completions-howto.org

https://superuser.com/questions/420525/scp-with-zsh-no-matches-found

https://www.zsh.org/mla/users/2009/msg00936.html

https://segmentfault.com/a/1190000002994217

rsync 部分参数的含义

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-v, --verbose 详细模式输出
-p, --perms 保持文件权限
-g, --group 保持文件属组信息
-o, --owner 保持文件属主信息
-r, --recursive 对子目录以递归模式处理。同步目录的时候要加上这个参数
-l, --links 保留软链结,加上这个参数,同步过来的文件会保持之前的软链接属性不变
-H, --hard-links 保留硬链结
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
-z, --compress 对备份的文件在传输时进行压缩处理
--stats 给出某些文件的传输状态
--progress 打印同步的过程
--timeout=TIME 同步过程中,IP超时时间,单位为秒
--delete 删除那些目标目录中有而源目录中没有的多余文件。这个是rsync做增量方式的全备份的最佳选择方案!!!!!!
--delete-before 接受者在输出之前进行删除操作。即先将目标目录中文件全部删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!!
--delete-after 在同步操作之后做比较,删除那些目标目录中有而源目录中没有的多余文件
--delete-excluded 删除目标目录中那些被该选项指定排除的文件
--ignore-errors 即使出现IO错误也进行删除,忽略错误
--exclude 指定同步时需要过滤掉的文件或子目录(即不需要同步过去的),后面直接跟不需要同步的单个文件名或子目录(不需要跟路径) ,过滤多个文件或子目录,就使用多个--exclude
--exclude-from 指定同步时需要过滤掉的文件或子目录,后面跟文件(比如/root/exclue.txt),然后将不需要同步的文件和子目录放到/root/exclue.txt下。
--version 打印版本信息
--port=PORT 指定其他的rsync服务端口
--log-format=formAT 指定日志文件格式
--password-file=FILEFILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second

prsync

prsync可以并行发送文件到多台服务器

https://www.tecmint.com/copy-files-to-multiple-linux-servers/

轻量级运维工具-pssh,pscp,prsync,pslurp,pnuke


  1. 不可已有文件夹/新建名/新建名,新建>=2层文件夹会报错 ↩︎