简介:
rsync 是一种快速且非常通用的文件复制工具。它可以在本地复制,通过ssh复制或拉取远程资源,或通过指定rsync用户复制资源到远程主机或通过rsync守护进程从远程主机拉取资源。它提供了大量选项来控制其行为的各个方面,并允许非常灵活地指定要复制的文件集。
rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法会查找大小或最后修改时间有改变的文件,属于增量传输。
scp 在网络上的主机之间复制文件。它使用 ssh(1) 进行数据传输,并使用相同的身份验证并提供相同的安全性SSH(1)。 如果身份验证需要,scp 将要求输入密码或密码短语。
rsync与scp区别:
scp相当于主机之间的复制、粘贴和覆盖,比较耗时;
rsync相当于复制,大小或最后修改时间没改变的文件不会被复制,提高传输效率;
传输方式:
Local: 本机复制;
Access via remote shell:通过ssh复制或拉取,一般分为口令(密码)或公钥(无密码)传输方式;
Access via rsync daemon:指定rsync账号/密码复制或拉取。注意与ssh格式区别,相同命令样式下:与::符号异同;
选项介绍:
准备两台主机,确认是否安装rsync:
#检查是否安装rsync
rpm -qa | grep rsync
#若没有则安装
yum -y install rsync
#启动rsync服务
systemctl start rsyncd.service
systemctl enable rsyncd.service
#检查是否已经成功启动
netstat -lnp|grep 873
复制方式介绍:
1.本机复制:
把/home/data/下所有目录和文件复制到/home/data1/
rsync -avz /home/data/* /home/data1/
把/home/data这个目录及下的目录和文件复制到/home/data1/
rsync -avz /home/data /home/data1/
2.通过ssh公钥复制(推荐使用):
这种方式其实是使用ssh协议复制或者拉取资源,ssh常用一般有两种方式,分别为口令(密码)和公钥(无密)。
1)口令方式,第一次请求远程主机时,远程主机会询问源机是否接受公钥,接受后输入密码即可传输。公钥的询问只在第一次成功连接之前,但是密码需要每次都输入,在自动化脚本中会带来一些不便。
2)公钥方式,源机通过ssh-keygen命令生产公钥和私钥(会有一些交互,一直回车即可),默认在~/.ssh/目录下:
把id_rsa.pub通过ftp、scp或rzsz等方式拷贝到远程主机的~/.ssh/目录(~要对应ssh通信时使用的用户主目录,可以使用whoami命令查看下当前用户)下,如果没有此目录也可以执行下ssh-keygen生成(注意和源机传送来的id_rsa.pub同名)或者直接mkdir创建,然后通过cat id_rsa.pub >> authorized_keys命令把源机的公钥加到远程主机上。后续只要是通过ssh通信,都不需要口令(密码)验证了。
复制命令格式实例:
以源主机下这些资源作为实例演示:
# -avz 选项介绍处自行查看
# -e "ssh -p 22",是指定远程主机的ssh端口,默认是22情况下不用指定,这里是举例说明而已
# --exclude,过滤不需要复制的文件或目录,支持多个
# ./ 是指本机目录
# root@192.168.1.13:/home/rsyncDir/ 连接远程主机的用户名和ip,以及目标路径
rsync -avz -e "ssh -p 22" --exclude="*.txt" --exclude="d1" ./ root@192.168.1.13:/home/rsyncDir/
#--delete 删除desc中src没有的文件或目录
rsync -avz --delete ./ root@192.168.1.13:/home/rsyncDir/
#从远程主机拉取资源到本地当前目录下
rsync -avz root@192.168.1.13:/home/rsyncDir/ ./
注意:
src目录后加/和不加/的区别,前者是目录下的资源,后者是当前目录及子目录和文件
3.指定rsync用户复制:
1)两台主机都更改配置/etc/rsyncd.conf。在配置文件后面追加下面配置:
uid = root
# //设置运行rsync 进程的用户
gid = root
use chroot = no
max connections = 4
# pid file = /var/run/rsyncd.pid
#//CentOS7中yum安装不需指定pid file 否则报错
lock file=/var/run/rsyncd.lock
log file = /var/log/rsyncd.log
# //此文件定义完成后系统会自动创建
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
# //同步时跳过没有权限的目录
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# //传输时不压缩的文件
效果如下:
都重启下:
systemctl restart rsyncd.service
2)设定同步规则:
先在两台主机都创建同步目录/root/rsyncDir
确定好服务端机器,服务端配置/etc/rsyncd.conf后面增加规则(注意的是,pull和push只能开启其中一种操作):
[rsyncDir]
#同步的路径
path=/root/rsyncDir
#规则描述
comment=测试规则
ignore errors
#是否可以pull
read only=no
#是否可以push
write only=yes
list=no
#下面配置同步时候的身份,注意该身份是在rsync里面定义的,并非是本机实际用户。等下说说如何在rsync里面定义身份。
#客户端获取文件的身份此用户并不是本机中确实存在的用户
auth users=rsyncuser
#//用来认证客户端的秘钥文件 格式 USERNAME:PASSWD 此文件权
#//限一定需要改为600,且属主必须与运行rsync的用户一致。
secrets file=/etc/rsyncd.passwd
#允许所有主机访问
hosts allow=*
效果如下:
3)继续服务端密码配置(注意用户名要和/etc/rsyncd.conf中规则配置下的auth users对应):
//文件用户名和路径为上面定义,别写错,密码自己定
echo 'rsyncuser:123456'>/etc/rsyncd.passwd
//修改权限
chmod 600 /etc/rsyncd.passwd
再次重启:
systemctl restart rsyncd.service
4)客户端设置登录密码:
//注意这里只需要服务器rsyncd.passwd 中的密码
echo '123456' >>/etc/rsyncd-test.passwd
chmod 600 /etc/rsyncd-test.passwd
5)在客户端机器中输入命令(XXX.XXX.XXX.XXX是服务端机器的ip);
a)开启push时(write only=yes),推送文件/目录到服务端:
#把客户端下rsyncDir目录及其下所有文件和子目录推送到服务端
rsync -auv --password-file=/etc/rsyncd-test.passwd /root/rsyncDir rsyncuser@XXX.XXX.XXX.XXX::rsyncDir
#把客户端下rsyncDir下所有文件和子目录推送到服务端
rsync -auv --password-file=/etc/rsyncd-test.passwd /root/rsyncDir/* rsyncuser@XXX.XXX.XXX.XXX::rsyncDir
b)开启pull时(read only=yes),从服务端拉去文件/目录:
rsync -auv --password-file=/etc/rsyncd-test.passwd rsyncuser@XXX.XXX.XXX.XXX::rsyncDir /root/rsyncDir
PS:
1)报错可查看日志:/var/log/rsyncd.log