Rsync命令是一个常用的用于文件传输和同步的工具,rsync 可以理解为 remote sync(远程同步),为了减少网络数据发送量,只发送源文件和目标文件之间的差异信息,从而实现数据的增量的复制。它不仅可以远程同步数据(类似于 scp 命令),还可以本地同步数据(类似于 cp 命令)。不同于 cp 或 scp 的一点是,使用 rsync 命令备份数据时,不会直接覆盖以前的数据(如果数据已经存在),而是先判断已经存在的数据和新数据的差异,只有数据不同时才会把不相同的部分覆盖。以下是一个简单的rsync命令示例:
将本地文件复制到远程服务器:
rsync -avz /本地路径/ 用户名@远程服务器IP地址:/远程路径/
注意:使用rsync进行远程文件传输,源端和目标端必须都装有rsync。
rsync优点:
rsync缺点:
rsync的本地数据传输模式,很类似于cp本地复制命令,可以实现文件目录移动备份等功能,多有不同的是rsync有增量复制的功能。
rsync远程shell数据传输模式一般是借助通道(如SSH)在两台服务器之间进行复制数据,这两台服务器之间是对等的,没有客户端与服务端之分,整个过程类似于SCP远程复制命令,所不同的是Rsync有增量复制的功能,但缺少scp的加密复制的功能。
守护进程传输模式是在客户端和服务端之间进行数据复制的,通常需要服务端部署守护进程服务,然后再客户端执行命令,实现数据的拉取和推送复制。守护进程的默认端口是837
#本地模式
Local: rsync [OPTION...] SRC... [DEST]
#通过远程shell数据传输模式
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] #从远端拉到本地
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST #从本地推到远端
#通过rsync守护进程模式
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
#如果只有源文件参数,没有目的文件参数,则只是显示源文件列表
Usages with just one SRC arg and no DEST arg will list the source files instead of copying.
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect to an rsync daemon, and require SRC or DEST to start with a module name.
在 rsync 命令中,如果使用单个冒号(:),则默认使用 ssh 协议;反之,如果使用两个冒号(::)或‘rsync://’,则使用 rsync 协议。使用 rsync 在远程传输数据(备份数据)前,是需要进行登陆认证的,这个过程需要借助 ssh 协议或者 rsync 协议才能完成。
ssh 协议和 rsync 协议的区别在于,rsync 协议在使用时需要额外配置,增加了工作量,但优势是更加安全;反之,ssh 协议使用方便,无需进行配置,但有泄漏服务器密码的风险。
OPTION 参数
-v 观察模式,输出更多资讯
-q 与 –v 相反,仅显示错误信息
-u 仅更新较新的文件
-n 假运行,不实际传输文件
-l, --links 软链接同步,指定的内容不一定有效
-L, --copy-links 将软链接转换为普通文件,实际内容放入文件中
-r 递归复制,针对目录
-p 复制时保持属性不变
-t 保存原有时间属性
-g 保存原有群组
-o 保存原有拥有人
-D 保存原有设备属性
-a 归档模式,相对于-rlptgoD,所以-a最常用
-z 在传输时压缩,节省带宽,加快传输速度
-P ,--progress显示传输进度
-e 使用协议通道,例如ssh,-e ssh
--delete 删除那些DST中SRC没有的文件
如上图所示:
-a 是归档传输,-z 是压缩传输,-v 是显示传输详情
另外源地址末尾不加'/'是传输整个目录到目标端,有'/'是指文件夹中的内容传输到目标端。
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
以上命令效果一样
如上图,软链接传输过来还是软链接文件,但内容不一定有效
-P 显示传输进度
远程shell传输模式,-e 可以指定ssh协议,并制定端口
1、首先选一台主机作为启动守护进程的主机,如A主机,在A主机上编辑配置文件;
vim /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# [ftp]
# path = /home/ftp
# comment = ftp export area
uid=nobody
gid=nobody
max connections=4
use chroot = no
pid file=/var/run.rsyncd.pid
transfer logging=yes
#模块名
[app]
path=/home/rsync
comment=test
ignore errors
read only=yes
list=yes
# 认证授权
#auth users=app
#secrets file=/etc/rsyncd.secrets
在A主机上启动守护进程:rsync --daemon
2、在B主机上传输文件,以下是从源端拉取到本地。两种方式,注意区别。
3、认证授权功能
在配置文件中配置授权用户及密码文件路径。
注:
1、服务端的密码文件格式是账号:密码,比如:rsync:123456
2、密码文件权限必须是600:chmod /etc/rsyncd.secrets
3、使用什么用户启动守护进程,密码文件的属主也应该是该用户
客户端指定密码文件
rsync -azv [email protected]::app --password-file=/home/rsyncd.secrets
1、客户端的密码文件权限必须为600,即:chmod 600 /home/rsyncd.secrets
2、密码文件中直接输入密码,如:123456