-
安装配置
RSSH
为数据同步进行准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ sudo apt-get install rsync # ubuntu 16.04/18.04默认源中都存在rssh ,但是 ubuntu 20.04开始,已经没办法从系统源中安装了。 # 原因在于 rssh 存在安全漏洞,并且长时间没有修复,并且已经没人维护了,需要使用 rrsync 替代。 $ sudo apt-get install rssh $ export RSH_RSYNC_USER=rsh_backup $ export RSH_RSYNC_USER_PASSWORD=rsh_password # 如果需要备份/var/log 目录,建议把用户组设置成 adm 用户组,否则很多日志没办法读取 # sudo useradd -s /usr/bin/rssh $RSH_RSYNC_USER -g users -G adm # 后期也可以通过 sudo usermod -g users -G adm $RSH_RSYNC_USER 更改用户组 $ sudo useradd -s /usr/bin/rssh $RSH_RSYNC_USER $ echo $RSH_RSYNC_USER:$RSH_RSYNC_USER_PASSWORD | sudo chpasswd # 配置文件中的umask可以限制用户是否只读,是否有可执行权限 # 许可用户执行rsync操作 $ sudo sed -i "s/^#allowrsync$/allowrsync/g" /etc/rssh.conf # 增加许可的用户操作 $ sudo sed -i '$a\user = \"'$RSH_RSYNC_USER':011:100000:\"' /etc/rssh.conf # 在ubuntu 16.04上 通过 setfacl 给予同步用户某些特殊目录读取权限的方式,目前测试来看会出现很多问题 # 如果是自建的目录,这个操作是没问题的,但是对于系统目录,比如/var/log/ 这个工具会导致 # mysql,tomcat等软件工作异常。 # 我需要备份日志,因此需要给予日志目录读取权限,注意,我们需要给予执行权限, # 否则没办法同步,尽管我们只需要读取数据 # 如果我们只给予 r 权限 会导致报告如下错误 # rsync: readlink_stat("/data/log/denyhosts.3.gz") failed: Permission denied (13) # 我们的 /data/log 实际上上/var/log目录的一个软连接,内部文件权限复杂,因此需要特殊处理 # ubuntu 16.04 不要使用 # sudo apt-get install acl && sudo setfacl -m u:$RSH_RSYNC_USER:r-x -R -L /data/log/ # 这个工具存在 BUG,可能设置的时候正常,过一段时间,就出现问题了。 # 还是老的 chmod 工作稳定,rsync 需要读取+执行权限,才能同步文件, # 因此设置为 755 设置为 645的时候 mysql/tomcat8工作不正常 $ sudo chmod -R 755 /data/log |
-
客户端同步,测试是否正常工作
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ export RSH_RSYNC_USER=rsh_backup $ export RSH_RSYNC_USER_PASSWORD=rsh_password $ export RSH_RSYNC_PORT=22 $ export REMOTE_SERVER=www.mobibrw.com $ export SYNC_DIR=/var/www # 测试是否可以正常工作,另一个方面是许可ssh的登录key否则我们后续没办法使用sshpass # 可以使用 --exclude 参数忽略指定的目录,相对路径,不是绝对路径 $ sudo rsync -avzP --delete -e 'ssh -p $RSH_RSYNC_PORT' $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DIR $SYNC_DIR |
-
转化为定时任务,自动同步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# 安装密码自动填写软件 $ sudo apt-get install sshpass $ cd ~ $ touch backup_rsync.sh $ chmod +x backup_rsync.sh $ echo -e '#!'"/bin/bash\n" >> backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_USER=rsh_backup' backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_USER_PASSWORD=rsh_password' backup_rsync.sh $ sed -i '$a\export RSH_RSYNC_PORT=22' backup_rsync.sh $ sed -i '$a\export REMOTE_SERVER=www.mobibrw.com' backup_rsync.sh # 此处注意最后的分隔符/如果没有这个分隔符,会导致目标目录多一个名为www的父目录 $ sed -i '$a\export SYNC_DIR=/var/www/' backup_rsync.sh # 可以使用 --exclude 参数忽略指定的目录,相对路径,不是绝对路径 $ sed -i '$a\sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e \"ssh -p $RSH_RSYNC_PORT\" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DIR $SYNC_DIR' backup_rsync.sh # 打开计划任务的日志,默认不开 $ sudo sed -i -r "s/#cron\.\*[ \t]*\/var\/log\/cron.log/cron.* \/var\/log\/cron.log/g" /etc/rsyslog.d/50-default.conf #write out current crontab $ sudo crontab -l > addcron #echo new cron into cron file ,每隔30分钟我们调度一次任务,前面是文件锁,防止并发冲突 #如果需要每小时执行一次,则修改为 "* */1 * * * flock ...." #如果需要凌晨2点执行,则修改为 "* 2 * * * flock ...." $ echo "30 * * * * flock -x -w 10 /dev/shm/backup_rsync_corn.lock -c \"bash `echo ~`/backup_rsync.sh\"" >> addcron #install new cron file $ sudo crontab addcron $ rm addcron $ sudo service cron restart |
目前我的阿里云,腾讯云服务器之间的同步脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash export RSH_RSYNC_USER=user export RSH_RSYNC_USER_PASSWORD=password export RSH_RSYNC_PORT=22 export REMOTE_SERVER=121.199.27.227 export SYNC_WWW_DIR=/var/www/ sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e "ssh -p $RSH_RSYNC_PORT" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_WWW_DIR $SYNC_WWW_DIR --exclude "wordpress/wp-content/cache/" --exclude "wordpress/wp-content/plugins/crayon-syntax-highlighter/log.txt" export SYNC_DATA_DIR=/data/ # 此处注意,如果使用 --exclude "/root/" 则忽略最顶部的root目录 # 如果使用 --exclude "root/" 则忽略所有路径中包含 root 的目录 # 主要 rsync 的 top-directroty 部分的规则 sshpass -p $RSH_RSYNC_USER_PASSWORD rsync -avzP --delete -e "ssh -p $RSH_RSYNC_PORT" $RSH_RSYNC_USER@$REMOTE_SERVER:$SYNC_DATA_DIR $RSYNC_DATA_DIR --exclude "/root/" |
参考链接
- CentOS:ssh限制ip和用户访问的设置
- Linux Restricted Shells: rssh and scponly
- rssh homepage
- 通过ssh执行rsync来完成同步文件的命令总结
- Linux使用笔记3-crontab添加定时任务
- 配置 rsync+ssh+密码登录
- setfacl命令基本用法
- Linux ACL权限设置(setfacl和getfacl)
- Linux中限制用户访问权限的3种方法
- Linux之setfacl权限配置
- setfacl to provide user access to /var/log does not work
- Linux的用户和用户组管理
- What is the "adm" group?
- Linux - 查看系统group
- 用rsync在copy时实现过滤
- rssh
- ubuntu 20.04配置rsync服务通过ssh同步