试了半天,服务端配置文件用普通用户,客户端推送传输的时候会报错,不管是改备份目录的属主属组还是权限都不行,一个root用户的文件传过来无法更改为root属组属主,只能是普通用户的,不过这个不影响备份过程,只是会在屏幕上显示报错信息而已,用这种备份的应该都是内网传输的吧,root用户也没啥影响,为了安全考虑防止权限溢出的话用普通用户也行。
#/bin/bash
#rsync+inotify自动备份
# 检测yum是否可用
[ $(yum repolist | awk '/repolist/{print$2}' | sed 's/,//') -eq 0 ] && echo '请检查yum源配置。' && exit 2
echo -e "\e[1;31m服务端请按1(备份机器)\n客户端安装请按2(需要备份的机器)\e[0m"
read -p "请输入:" zbks
case "$zbks" in
1)
#安装服务端
echo -e "\e[1;31m安装rsync中..\e[0m"
yum install rsync -y
if [ $? = 0 ];then
#修改配置文件
echo > /etc/rsyncd.conf
cat >> /etc/rsyncd.conf <<-EOF
#rsync使用的用户,默认nobody
uid = root
gid = root
#是否限定在该目录下,默认为true,当有软连接时,需要改为fasle
use chroot = no
#监听端口
port 873
#最大链接数
max connections = 200
#指定lock文件用来支持“max connections ”参数使总连接不会超过限制
lock file = /var/run/rsync.lock
#pid文件位置
pid file = /var/run/rsyncd.pid
#日志文件
log file =/var/log/rsyncd.log
#超时时间
timeout = 300
#忽略io错误
ignore errors
#是否权限设置read为只读权限,因为是客户端推送过来,所以需要写入权限
read only = false
#是否允许客户端查看可用模块
truelist = false
#允许连接的ip段或个别ip,默认任何人都可以连接
#hosts allow =
#不允许连接的IP段或个别ip
#hosts deny = 0.0.0.0/32
#指定以空格或逗号分隔用户,他们可以使用这个模块
auth users = rsync
#指定用户名和密码文件 格式: 用户名:密码 密码不超过8位
secrets file = /etc/rsync.password
#同步模块名称
[backup]
#同步目录绝对路径
path = /backup
#遇到以下后缀的文件不进行压缩
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
EOF
#创建备份目录
mkdir /backup
#创建虚拟账号的密码文件
echo "rsync:a1b2c3" > /etc/rsync.password
chmod 600 /etc/rsync.password
#已守护进程启动rsync
rsync --daemon
#开机自启
echo "/usr/bin/rsync --daemon" >>/etc/rc.d/rc.local
chmod a+x /etc/rc.d/rc.local
echo -e "\e[1;31m已配置完成并开机自启,备份目录为\backup。\n请使用ps -ef |grep rsync|grep -v grep命令查看进程。\n接下来请在客户端执行此脚本2选项。\e[0m"
else
echo -e "\e[1;31m安装rsync失败。\e[0m"
exit 3
fi
;;
2)
#安装客户端
echo -e "\e[1;31m安装rsync中..\e[0m"
yum install rsync -y
if [ $? = 0 ];then
#与服务端虚拟账号同步密码
echo "a1b2c3" >/etc/rsync.password
chmod 600 /etc/rsync.password
echo -e "\e[1;31m安装inotify-tools中..\e[0m"
yum install -y inotify-tools
#修改inotify默认参数
#inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
echo "fs.inotify.max_queued_events=1000000" >> /etc/sysctl.conf
#可监控的目录最大数
echo "fs.inotify.max_user_watches=1000000" >> /etc/sysctl.conf
#每个用户创建inotify实例最大值
echo "fs.inotify.max_user_instances=100000" >> /etc/sysctl.conf
#使调整inotify内核参数立刻生效
sysctl -p
#创建rsync+inotifywait脚本实现单向实时同步
while [ 1 ]
do
echo -e "\e[1;31m请输入需要备份的目录绝对路径(该目录需已存在,格式如:/bak)\e[0m"
read -p "请输入:" bak
echo -e "\e[1;31m请输入备份机器的IP,如:192,168.248.129\e[0m"
read -p "请输入:" BIP
echo -e "\e[1;31m需要备份的目录为$bak,备份机器IP为$BIP,是否正确?\e[0m"
read -p "是:y 否:输入其它任意键则重新输入 " yn
if [ $yn = y ];then
#创建rsync+inotify脚本实时监控并备份
touch /root/inotify_rsync.sh
cat >> /root/inotify_rsync.sh <<-OK
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete $bak"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/rsync.password $bak/ rsync@$BIP::backup"
\$INOTIFY_CMD | while read directory event file
do
\$RSYNC_CMD
done
OK
echo "/bin/bash /root/inotify_rsync.sh &" >> /etc/rc.d/rc.local
chmod a+x /etc/rc.d/rc.local
/bin/bash /root/inotify_rsync.sh &
echo -e "\e[1;31m已配置完成并启动,inotify_rsync脚本在/root/下,如有错误请自行修改。\e[0m"
break
fi
done
else
echo -e "\e[1;31m安装rsync失败。\e[0m"
exit 3
fi
;;
*)
echo -e "\e[1;31m已退出\e[0m"
exit
;;
esac
参考帖子: