目录
[TOC]
指令格式
rsync flags sourcce destination
服务端
安装
一般机器都是默认安装rsync的,不用再去安装。
ubuntu有可能安装了但是没有开启
sudo vim /etc/default/rsync
修改配置项即可开启
RSYNC_ENABLE=true #false改true
创建配置文件
将rsyncd.conf copy到/etc目录下
sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc
打开此配置文件,自行配置。
sudo vim /etc/rsyncd.conf
其中path
是需要同步的路径,你可以暂时只对此项配置,然后即可测试。
创建同步的账号和密码
先创建账号密码文件
sudo vim /etc/rsyncd.secrets
输入账号密码
file_rsync:1236654987
修改权限
sudo chmod 0600 /etc/rsyncd.secrets
启动rsync
sudo /etc/init.d/rsync start
开机启动
echo "/etc/init.d/rsync start\n" >> /etc/rc.local
防火墙开放端口
sudo ufw allow 873
默认配置文件
# sample rsyncd.conf configuration file
# GLOBAL OPTIONS
#motd file=/etc/motd
#log file=/var/log/rsyncd
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
# The init.d script does its own pid file handling,
# so omit the "pid file" line completely in that case.
# pid file=/var/run/rsyncd.pid
#syslog facility=daemon
#socket options=
# MODULE OPTIONS
[ftp]
comment = public archive
path = /var/www/pub
use chroot = yes
# max connections=10
lock file = /var/lock/rsyncd
# the default for read only is yes...
read only = yes
list = yes
uid = nobody
gid = nogroup
# exclude =
# exclude from =
# include =
# include from =
# auth users =
# secrets file = /etc/rsyncd.secrets
strict modes = yes
# hosts allow =
# hosts deny =
ignore errors = no
ignore nonreadable = yes
transfer logging = no
# log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
配置文件说明
# sample rsyncd.conf configuration file
# GLOBAL OPTIONS
#motd file=/etc/motd #登录欢迎信息
#log file=/var/log/rsyncd #日志文件
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
pid file=/var/run/rsyncd.pid
#指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。
#syslog facility=daemon
#自定义tcp选项,默认是关闭的
#socket options=
#以下是模块信息,我们可以创建多个模块
# MODULE OPTIONS
[ftp]
comment = public archive #模块描述
path = /var/www/pub #需要同步的路径
use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
# max connections=10 #最大连接数
lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。
# the default for read only is yes...
read only = yes #只读选项
list = yes #客户请求时可用模块时是否列出该模块
uid = nobody #设定该模块传输文件时守护进程应该具有的uid
gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限
# exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include #这个我的理解是排除目录中不需同步的文件
# exclude from = #可以指定一个包含exclude模式定义的文件名
# include = #与exclude相似
# include from = #可以指定一个包含include模式定义的文件名
auth users = file_rsync #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)
secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600
strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
# hosts allow = #允许的主机
# hosts deny = #拒绝访问的主机
ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误
ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户
transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
# log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式
timeout = 600 #超时设置(秒)
refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩
日志格式选项列表:
%h
: 远程主机名%a
: 远程IP地址%l
: 文件长度字符数%p
: 该次rsync会话的进程id%o
: 操作类型:send
、recv
或 del
%f
: 文件名%P
: 模块路径%m
: 模块名%t
: 当前时间%u
: 认证的用户名(匿名时是null)%b
: 实际传输的字节数%c
: 当发送文件时,该字段记录该文件的校验码
客户端
同步
客户端不需要进行特殊的配置,直接同步即可, 最后的ftp跟服务端配置的 [ftp] 一致,
注意这个段在服务端可以添加多个, ./
表示 同步到当前目录
,可自定义
rsync -vzrtopg --progress --delete [email protected]::ftp ./
提示输入密码,之后就可以同步了
下面通过,添加定时任务来同步文件,这种情况就密码就得自动验证了,所以需要添加一个密码文件
创建密码文件
sudo vim /etc/rsync.pwd
输入 密码,保存 #密码要跟服务端设置的一致
注意指定使用的密码文件中只需要有密码,不要有用户名。修改文件访问权限,注意:下面这两步操作是必须的,没有足够权限同步就会不成功,ls -l
你所指向的目录
sudo chmod 0600 /etc/rsync.pwd
sudo chown 普通用户:普通用户组 /etc/rsync.pwd
注:这里如果使用的是非root用户,这里只能使用自己当前用户和自己所在的组,如果是root用户则第二行不用设置
然后我们打开crontab
,添加自动同步
crontab -e
*/1 * * * * rsync -a --password-file=/etc/rsync.pwd [email protected]::ftp /databk
同步删除的文件
一分钟同步一次。只要你在Server端添加了新文件或新文件夹,那么1分钟后就会自动同步到客户端。当在Server端删除一个文件或目录的时候,希望同步时也删除掉还需要添加一个参数 --delete
修改上述配置如下所示:
*/1 * * * * rsync -a --delete --password-file=/etc/rsync.pwd [email protected]::ftp /databk
添加--delete
参数就行了,这样以后在Server端删文件已能同步了。
同步时排除文本/文本夹
另外有些情况下还得忽略一些日志目录或文件,可以使用 --exclude
参数,可以加多个,如下
- rsync -zrtopg --exclude '.git' --exclude "Log" ./ /home/www/project
也可以写到一个文件中来加载
- rsync -zrtopg --exclude-from=exclude.txt ./ /home/www/project
文件中每行一个
应该也可支持正则。 *[a-z0-9]
其它未测。
.svn
Log
abc.txt
[0-9]*
dir2/.[a-z0-9]*
参数说明
-a 递归方式传输文件,并保持文件属性,等价-rlptgoD不包含-H
-r 子目录以递归模式处理
-l 保持符号链接文件
-H 保持硬链接文件
-p 保持文件权限
-t 保持文件时间信息
-g 保持文件归属组信息
-o 保持文件归属用户信息
-D 保持设备文件和特殊文件
-z 在传输文件时进行压缩处理
--exclude=PATTERN 指定排除一个不需要传输文件匹配模式
--exclude-from=FILE 从FILE中读取排除规则
--include=PATTERN 指定需要传输的文件匹配模式
--include-from=FILE 从FILE中读取匹配规则
--copy-unsafe-links 复制指向复制源路径目录以外的链接文件
--safe-links 忽略指向复制源路径目录以外的链接文件(默认)
--existing 仅更新那些已经存在于接收端的文件,而不复制新创建文件
--ignore-existing 忽略那些已经存在于接收端的文件,只复制新创建文件
-b 当有变化时,对目标目录中的旧文件进行备份
--backup-dir=DIR 与-b结合使用,指定备份路径
--link-dest=DIR 当文件未改变时在指定路径创建硬链接文件
--delete 删除接收端还存在而保存端不存在的文件
--delete-before 接收端在传输之前进行删除操作(默认)
--delete-during 接收端在传输过程中进行删除操作
--delete-after 接收端在传输之后进行删除操作
--delete-excluded 接收端在传输同时进行删除操作
--e,--rsh=COMMAND 指定代替rsh的shell程序,例如可以指定为ssh
--ignore-erros 即使出现I/O错误也要进行删除
--partial 保留因故没有完全传输的文件,以加快随后的再次传输
--progress 在传输时显示传输过程
-p 等价于—partial—progress
--delay-updates 将正在更新的文件先保存到.~tmp~临时目录,待传输完毕再更新目标文件
-v,--verbose 详细输出模式
-q,--quiet 精简输出模式
-h,--human-readable 输出文件大小
-n,--dry-run 显示那些文件将要被传输
--list-only 仅列出文件而不进行复制
--rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径
--password-file=FILE 指定从FILE中读取口令,避免在终端中输入口令
-4,-6 使用IPv4或者IPv6
--version 打印版本信息
--help 显示帮组信息
几个常用的例子
1.在本地机器上对两个目录同步
rsync -zvr filename1 filename2
上述代码是将filename1
中的文件与filename2
中的文件同步,如果将filename2中的文件同步到filename1
中,修改代码为:
rsync -zvr filename2 filename1
2.使用rsync –a 同步保留时间标记
rsync -azv filename1 filename2
使用上述命令,将filename2
中新同步的文件的时间与filename1
中的创建的时间相同,它保留符号链接、权限、时间标记、用户名及组名相同。
3.将远程服务器的文件同步到本地
rsync -avz [email protected]:/home/ubuntu/filename2 filename1
上述命令是将远程192.168.0.1
的主机上filename2
同步到本地的filename1
。
注意:如果远程主机的端口不是默认的22
端口,假如是4000
端口,上述的命令修改为,
rsync -avz '-e ssh -p 4000' [email protected]:/home/ubuntu/filename2 filename1
4.从本地同步文件到远程服务器
rsync -avz filename1 [email protected]:/home/ubuntu/filename2
上述命令是将本地的filename1
同步到远程192.168.0.1
的主机上。
同理如果端口不是22
,使用以下命令
rsync -avz '-e ssh -p 4000' filename1 [email protected]:/home/ubuntu/filename2
基本操作
把文件夹A
里面的文件复制到文件夹B
:
rsync -r A/ B/
使用-r
(recursive)同步出来的B文件夹中的文件的时间戳会被改变
若要保持A和B中的文件时间戳一致,可使用:-a, --archive archive mode;
rsync -a A/ B/
-h
:human readable--partial
,传输大文件时很有用,传到一半被停止,下次可以继续传--progress
,显示实时进度
--progress
和--partial
可以合并在一起,变成-P
--delete
,删除B中A没有的文件-z
,在传输时压缩,节省流量
--remove-source-files
同步完毕后删除source
的文件
这个命令只能删除文件,不能删除目录
故可配合find删除空目录find A/ -type d -empty -delete
所以汇总下来就用这个命令
rsync -ahPz A/ B/
大段大段的复制是真的爽😂