1.安装rsync包
yum install rsync
2.两种工作模式
2.1.本地
rsync -r /var/www/image/ /var/www/test/
2.2.远程
rsync -r /var/www/test/ root@192.168.56.102:/var/www/test/
或
rsync -r root@192.168.56.102:/var/www/test/ /var/www/test/
3.两种认证协议
3.1.ssh认证
rsync -r /var/www/test/ root@192.168.56.102:/var/www/test/
3.2.rsync 协议认证
3.2.1.配置账号密码文件(远程)
echo -e "image:123456\ntest:123456" > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd
3.2.2.修改配置文件 /etc/rsyncd.conf(远程)
# /etc/rsyncd: configuration file for rsync daemon mode
uid = root
gid = root
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[image]
path = /var/www/image/
# https://download.samba.org/pub/rsync/rsyncd.conf.5#auth_users
auth users = image
# https://download.samba.org/pub/rsync/rsyncd.conf.5#secrets_file
secrets file = /etc/rsyncd.passwd
# 此参数确定客户端是否能够上传文件。如果“只读”为真,则任何尝试上传都将失败。如果“只读”为假,则如果守护程序端的文件权限允许上传,则可以上传。默认情况下所有模块都是只读的。请注意,“ auth users ”可以基于每个用户覆盖此设置。
read only = false
[test]
path = /var/www/test/
# https://download.samba.org/pub/rsync/rsyncd.conf.5#auth_users
auth users = test
# https://download.samba.org/pub/rsync/rsyncd.conf.5#secrets_file
secrets file = /etc/rsyncd.passwd
# 此参数确定客户端是否能够上传文件。如果“只读”为真,则任何尝试上传都将失败。如果“只读”为假,则如果守护程序端的文件权限允许上传,则可以上传。默认情况下所有模块都是只读的。请注意,“ auth users ”可以基于每个用户覆盖此设置。
read only = false
3.2.3.开启 rsyncd 服务(远程)
systemctl start rsyncd
3.2.4.配置密码文件实现无需手动输入密码(本地)
echo 123456 > /etc/rsync.image.passwd
chmod 600 /etc/rsync.image.passwd
echo 123456 > /etc/rsync.test.passwd
chmod 600 /etc/rsync.test.passwd
3.2.5.请求同步(本地)
rsync -r /var/www/image/ image@192.168.56.101::image
也可以使用 url 格式语法:
rsync -r /var/www/image/ rsync://image@192.168.56.101/image
1.安装inotify-tools包
yum install inotify-tools
1.创建脚本文件 /var/www/inotify_rsync.sh(本地)
#!/bin/bash
# 本地被监控目录
watch_dir=/var/www/image/
# 虚拟用户
user="image"
# 虚拟用户密码
export RSYNC_PASSWORD=123456
# 远程模块名
module="image"
# 远程主机ip
ip=192.168.56.101
# 先整体同步一次
rsync -azc --delete ${watch_dir} ${user}@${ip}::${module}
# 切换到被监控目录下,然后用inotifywait监控./目录,这样后期就可以用-R选项同步新增的子目录
cd $watch_dir
/usr/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%w%f:%Xe:%T' -e create,delete,modify,move,attrib,close_write ./ \
--exclude=".*.swp" | \
while read line
do
# $line的输出format为:文件路径:事件:时间
# 获取文件的绝对路径
FILE=$(echo $line | awk -F: '{print $1}')
# 获取监控的事件
EVENT=$(echo $line | awk -F: '{print $2}')
# 监控到对文件的下述行为后,只把文件同步到远端
if [[ $EVENT =~ 'CREATE' ]] || [[ $EVENT =~ 'MODIFY' ]] || [[ $EVENT =~ 'CLOSE_WRITE' ]] || [[ $EVENT =~ 'MOVED_TO' ]] || [[ $EVENT =~ 'ATTRIB' ]];then
rsync -azcR ${FILE} ${user}@${ip}::${module}
fi
# 监控到涉及到目录的改动,将目录同步到远端,例如用dirname ${FILE}获取目录
if [[ $EVENT =~ 'DELETE' ]] || [[ $EVENT =~ 'MOVED_FROM' ]];then
rsync -azcR --delete $(dirname ${FILE}) ${user}@${ip}::${module} &>/dev/null
fi
done &
# 末尾的&符号,代表在子shell中提交命令,这样进程的ppid就变为1,当前窗口关闭,该进程依然存活
2.创建/usr/lib/systemd/system/inotify_rsync.service开机自启文件(本地)
[Unit]
Description=inotify_rsync
Wants=network-online.target
[Service]
User=root
Type=forking
ExecStart=/usr/bin/bash /var/www/inotify_rsync.sh start
ExecStop=/usr/bin/bash /var/www//inotify_rsync.sh stop
SuccessExitStatus=143
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=inotify_rsync
[Install]
WantedBy=multi-user.target
3.创建日志配置文件 /etc/rsyslog.d/inotify_rsync.conf(本地)
if $syslogtag contains 'inotify_rsync' then /var/log/inotify_rsync.log
if $syslogtag contains 'inotify_rsync' then stop
4.启动(本地)
systemctl start inotify_rsync