rsync同步远程主机目录,并通过md5校验目录

一 rsync

​  rsync全称remote sync,是一种更高效、可以本地或远程同步的命令,之所以高效是因为rsync会对需要同步的源和目的进度行对比,只同步有改变的部分,所以比scp命令更高效,但是rsync本身是一种非加密的传输,可以借助-e选项来设置具备加密功能的承载工具进行加密传输。

工作模式

  1. shell模式,也称作本地模式,用于同步本地的文件或者目录。

    rsync [OPTION...] SRC... [DEST]
    
  2. 远程shell模式,此时可以利用ssh协议承载其数据传输过程,类似scp,去同步远程主机的目录或者文件。

    Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]	## 与scp类似
    Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
    
    Push: 表示上传    Pull: 表示下载 
    例如:将远程主机的一个目录同步到本地  
    rsync -avP --delete billapp@10.135.134.184:/data12/data/20190704 /data12/data/20190704
    
  3. 列表模式,其工作方式与ls相似,仅列出源目录的内容。

    rsync [OPTION...] SRC... 	## 不要填写[DEST]
    
  4. 服务器模式(C-S模式),此时,将rsync在服务端作为守护进程启动,绑定端口(默认873,可通过配置文件修改)。监听收客户端的数据请求;同时,客户端可使用rsync命令把文件发送到守护进程,也可以像服务器请求获取文件,类似于git上的push、pull。客户端与服务端都有配置文件,默认是 /etc/rsync.conf,当然也可以在选项参数中指定配置文件路径。具体通过 man 1 rsync 查看帮助。

    Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]	##	::SRC 是指定一个模块(对应一个特定目录)
    	rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
    Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
    	rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
    

命令选项

-v, 详细输出模式,–verbose
-a,–archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于 -rlptgoD
-r,,–recursive 对子目录以递归模式处理
-l, --links 保留文件的符号链接
-p,–perms 保持文件权限
-t, --times 保持文件时间信息
-g,–group 保持文件属组信息
-o,–owner 保持文件属主信息
-D,–devices 保持设备文件信息
-P, 等同于 --partial --progress 显示备份过程
–delete,将源和目标服务器上有差异的部分删除掉
–daemon,以守护进程形式启动
–port= ,指定端口
–config=,指定配置文件路径
–bwlimit=KBPS,限制带宽

配置文件

## /etc/rsync.conf
## 服务端和客户端可配置成同样的配置文件

uid = billapp		#系统用户
gid = sngrp			#用户所属组
use chroot = no		#是否禁锢用户家目录
max connections = 7		#最大连接用户数
pid file  = /sngrp/billapp/download/logs/rsyncd.pid		#设置rsync运行时pid文件的位置
lock file = /sngrp/billapp/download/logs/rsync.lock		#设置rsync运行时lock文件的位置
log file  = /sngrp/billapp/download/logs/rsyncd.log		#设置rsync运行时log文件的位置

[download]		# 一个模块表示一个备份目录或者文件
path = /sngrp/billapp/download		# 备份目录位置
ignore errors					   # 是否忽略错误
read only = true				   # 只读,适用于Client端pull场景
list = false					   # 是否允许列出名单

启动脚本

start_rsync_server.sh 启动服务端守护进程

#!/bin/bash

# rsync为了防止重复启动守护进程,建立了rsyncd.pid文件,重新启动时需要删除
rm ${HOME}/download/logs/rsyncd.pid

PORT=5000
rsync --daemon --port=$PORT --config=${HOME}/users/etc/rsync.conf

stop_rsync_server.sh 停止服务端守护进程

#!/bin/bash

WHOAMI=`whoami`
kill -9 `ps -ef | grep $WHOAMI | grep rsync | grep -v grep | awk '{print $2}'`

sync.sh 客户端同步脚本,启动同步

#!/bin/bash

# 10.135.139.41是服务端的IP
# download是模块名
start=`date '+%Y-%m-%d %H:%M:%S'`
rsync --port=5000 -avP --delete @10.135.139.41::download /sngrp/billapp/download

end=`date '+%Y-%m-%d %H:%M:%S'`
echo "$start  >>>>>>  $end download!" >> ${HOME}/download/logs/sync.log

rsync同步文件时如何排除指定文件夹或多个目录

参考链接:Rsync同步文件时如何排除指定文件夹或多个目录

  如果使用rsync同步目录时,需要路过某些目录下的一些子目录或者文件,可以在sync.sh脚本启动的配置项中添加这些选项:

–exclude  ## 排除特定文件或目录,可以进行模式匹配
–include   ## 包含特定文件或目录,可以进行模式匹配
–exclude-from  ## 将需要排除特定文件或目录写入到一个文件列表中,通过文件列表来查找(文件较多时应用)
–files-from      ## 将需要包含特定文件或目录写入到一个文件列表中,通过文件列表来查找(文件较多时应用)

举例:

##	排除特定目录或文件
rsync -a --exclude 'dir1' src_directory/ dst_directory/

##	只排除目录内容,但不是目录本身
rsync -a --exclude 'dir1/*' src_directory/ dst_directory/

##	排除多个文件或目录
##	排除file1.txt,排除目录dir/*,排除目录dir2
##	方法一:指定多个--exclude选项
rsync -a --exclude 'file1.txt' --exclude 'dir1/*' --exclude 'dir2' src_directory/ dst_directory/

##	方法二:用括号{}列出您想要排除的文件和目录,中间用逗号隔开
rsync -a --exclude={'file1.txt','dir1/*','dir2'} src_directory/ dst_directory/

##	方法三:将指定要排除的文件和目录写入一个文本文件中,并将文件传递给--exclude-from选项
vi exclude-file.txt
##	编辑exclude-file.txt文件,加入以下内容:
file1.txt
dir1/
dir2
##	rsync添加--exclude-from选项,并将文件名exclude-file.txt传递给它
##	执行结果与上面的方法相同
rsync -a --exclude-from='exclude-file.txt' src_directory/ dst_directory/


##	基于匹配文件或目录名称的模式排除文件和目录。
##	例如,rsync要排除同步复制.jpg图片文件
rsync -a --exclude '*.jpg*' src_directory/ dst_directory/

##	假设您只想排除 除了.jpg结尾的文件 之外的所有其他文件和目录,使用以下命令:
rsync -a -m --include='*.jpg' --include='*/' --exclude='*' src_directory/ dst_directory/
##	解析:
##	-m - 移除空目录
##	当使用多个包含/排除选项时,应用第一个匹配规则。
##	--include='*.jpg' - 首先,我们应该包括所有的.jpg 文件。
##	--include='*/' - 然后我们指定包含src_directory目录中的所有子目录。没有这个,rsync将只复制顶层目录中的*.jpg文件。

##	另一个选项是通过管道将find命令的输出传输到rsync:
find src_directory/ -name "*.jpg" -printf %P\\0\\n | rsync -a --files-from=- src_directory/ dst_directory/

##	-printf %P\\0\\n - 将从文件路径中删除src_directory/。
##	--files-from=- - 意味着只包含来自标准输入的文件(从find命令传递的文件)。

##	--files-from 和 --include 的作用正好与 --exclude 和 --exclude-from 相反
##	它们使用的方法相同

  也可以使用 --files-from=‘include-file.txt’ 参数,将你需要包含的所有子目录和文件写入 include-file.txt 文件中。例如:

##	修改sync.sh
#!/bin/sh

start=`date '+%Y-%m-%d %H:%M:%S'`

rsync --port=11000 -avP -r --files-from='home-include-file.txt' @10.135.139.43::download /sngrp/billapp

end=`date '+%Y-%m-%d %H:%M:%S'`
echo "$start  >>>>>>  $end download!" >> /sngrp/billapp/rsync/logs/sync.log


##	------------------------------------------------------------------------
##	把--delete选项去掉,防止有些目录没有包含,导致删除本地已有的目录,比如删除本地的隐藏目录
##	添加-r选项,这样才能递归拷贝深层子目录中的数据!!!!!!


vim home-include-file.txt
##	添加如下内容:
dir1	##	如果写成dir1/*,会报错,不能匹配到该类型的文件,他不支持'*'这种模式匹配
dir2		  
file1
file2

常见问题

错误1: rsync: read error: Connection reset by peer (104) 
rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receiver=3.0.2] 
解决:很大可能是服务器端没有开启 rsync 服务。开启服务。 或者开启了防火墙指定的端口无法访问。 

错误2:@ERROR: chdir failed 
rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.2] 
解决:服务器端同步目录没有权限,cwrsync默认用户是Svcwrsync。为同步目录添加用户Svcwrsync权限。 

错误3:@ERROR: failed to open lock file 
rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.2] 
解决:服务器端配置文件 rsyncd.conf中添加 lock file = rsyncd.lock 即可解决。 

错误4:@ERROR: invalid uid nobody 
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.2] 
解决:在rsyncd.conf文件中添加下面两行即可解决问题 
UID = 0 
GID = 0 

错误5:@ERROR: auth failed on module test2 
rsync error: error starting client-server protocol (code 5) at main.c(1296) [receiver=3.0.2] 
解决:服务端没有指定正确的secrets file,请在 [test2]配置段添加如下配置行: 
auth users = coldstar #同步使用的帐号 
secrets file = rsyncd.secrets #密码文件 

错误6:password file must not be other-accessible 
解决:客户端的pass文件要求权限为600, chmod 600 /etc/rsync.pass 即可。 

错误7:rsync: chdir /cygdrive/c/work failed
: No such file or directory (2)
解决:服务器端同步文件夹路径或名称写错了,检查path。


二 md5校验目录是否一致

creat_md5.sh 将目录下所有的普通文件生成md5校验码,子目录不考虑

#!/bin/bash

Date=$(date +%Y%m%d%H%M%S)

##	由于md5sum对大型文件需要耗费很长的时间,所以跳过大于50M的文件
find ./ -maxdepth 1 -type f -size -50M | while read filename
do
    md5sum $filename >> mymd5.$Date;
done

exit 0

​ 将这个脚本事先在需要同步的目录下运行一遍,生成myd5文件,然后同步到客户端。通过md5sum校验:

md5sum -c mymd5.*
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值