0 环境

IP 用途 OS
192.168.2.21 rsync-server centos7.3
192.168.2.22 rsync-client centos7.3

1 rsync server

常安装于 备份服务器

  1. # rsyncd 编辑配置文件
  2. vim /etc/rsyncd.conf
  3. uid=root
  4. gid=root
  5. max connections=4
  6. log file=/var/log/rsyncd.log
  7. pid file=/var/run/rsyncd.pid
  8. lock file=/var/run/rsyncd.lock
  9. secrets file=/etc/rsyncd_users.db # 指定rsync 的用户密码文件
  10. [www]
  11. comment= backup web
  12. path=/data/test
  13. read only = no
  14. hosts allow = * # 允许任意网段服务器访问此模块
  15. exclude=test # 不让哪个用户访问
  16. auth users=root # 认证用户
  17. # 如果需要对所有人都可以免密, 则注释掉secrets file, auth users

创建账户验证文件

  1. vim /etc/rsyncd_users.db
  2. root:root123 # "用户名:密码"的形式
  3. # 这一步很关键,不然会报错
  4. chmod 600 /etc/rsyncd_users.db

启动服务

systemctl start rsyncd && systemctl enable rsyncd

2. rsync client

  1. # 安装 inotify-tools
  2. yum install -y inotify-tools
  3. # 创建rsyncd-log 目录
  4. mkdir /var/log/rsyncd/
  5. # 编辑监听脚本,内容如下
  6. mkdir -p /usr/local/scripts/ -p
  7. vim /usr/local/scripts/user-inotify.sh
  8. chmod +x /usr/local/scripts/user-inotify.sh
  1. #!/bin/bash
  2. HOST=192.168.2.21 # 远程主机的IP
  3. SVN_SRC=/data/test/ # 远程目录
  4. WEB_SRC=/data/test/ # 本地目录
  5. PASSWD=/etc/rsyncd/root.pwd # 在文件中指定你的密码,
  6. DES=www # rsync-server 端的标签
  7. USER=root # rsync-server 所定义的用户
  8. DATE=`date +%F`
  9. RSYNC_LOGFILE=/var/log/rsyncd/${DATE}-rsync.log
  10. inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${WEB_SRC} | while read file
  11. do
  12. rsync -aH --delete --progress ${WEB_SRC} ${USER}@${HOST}::${DES} --password-file=${PASSWD} && echo "${file} rsync succesed" >> ${RSYNC_LOGFILE} 2>&1
  13. if [ $? -ne 0 ];
  14. then
  15. echo "remote rsync failed" >> ${RSYNC_LOGFILE};
  16. fi
  17. echo "-----------------------------------END-------------------------------------" >> ${RSYNC_LOGFILE} 2>&1;
  18. done

关键的一步:如下

  1. echo root123 > /etc/rsyncd/root.pwd
  2. chmod 600 /etc/rsyncd/root.pwd

再说一次 : 本文中所有密码文件的权限一定要设为 600 权限。

测试一下:

  1. bash -x user-inotify.sh
  2. echo test-page > /data/test/test-page.txt
  3. # 去 rsync-server 上对应的目录看一眼,是否同步过去
  4. # 如果没问题
  5. # 写一个定时任务
  6. echo * * * * * /usr/local/scripts/user-inotify.sh > /var/spool/cron/root

3 参考文档