gitlab备份库局域网中远程备份至另一台windows电脑

Posted 幽反丶叛冥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gitlab备份库局域网中远程备份至另一台windows电脑相关的知识,希望对你有一定的参考价值。

摘要:搭建的gitlab服务器,硬盘不太可靠,是一块不知名的mSATA硬盘,前面通过手动通过(xshell + xftp)的方式进行备份到其他电脑,这里通过 inotify+rsync 自动备份一下

相关文章

  1. CentOS7上安装gitlab
  2. gitlab使用163邮箱向用户发送邮件
  3. CentOS 7.8 密码重置
  4. centos7 centos-home 磁盘空间转移至centos-root下
  5. xftp5 连接 centos7.8
  6. gitlab备份库局域网中远程备份至另一台windows电脑

一、xshell + xftp手动备份


01、创建gitlab备份

在保持gitlab处于正常运行状态,直接执行gitlab-rake gitlab:backup:create进行备份

[root@localhost ~]# gitlab-rake gitlab:backup:create
2021-06-19 14:26:30 +0800 -- Dumping database ... 
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2021-06-19 14:26:34 +0800 -- done
2021-06-19 14:26:34 +0800 -- Dumping repositories ...
 * company/gitfilecompany (@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35) ... [SKIPPED]
[SKIPPED] Wiki
 * dylyy/myselfsystem (@hashed/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce) ... [DONE]
[SKIPPED] Wiki
 * zzshkj/queue_system_zzcar (@hashed/4b/22/4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a) ... [DONE]
[SKIPPED] Wiki
 * nanxinhospital/nanxinhospitalandroid (@hashed/79/02/7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451) ... [DONE]
[SKIPPED] Wiki
 * nanxinhospital/nanxinhospitalwindow (@hashed/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3) ... [DONE]
[SKIPPED] Wiki
 * ynwnkj/php (@hashed/19/58/19581e27de7ced00ff1ce50b2047e7a567c76b1cbaebabe5ef03f7c3017bb5b7) ... [DONE]
[SKIPPED] Wiki
 * yayb/php (@hashed/4a/44/4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5) ... [DONE]

 ... ... ...

[SKIPPED] Wiki
 * hqzxrc/php (@hashed/05/ad/05ada863a4cf9660fd8c68e2295f1d35b2264815f5b605003d6625bd9e0492cf) ... [DONE]
[SKIPPED] Wiki
 * cdgsgl/php (@hashed/9a/e2/9ae2bdd7beedc2e766c6b76585530e16925115707dc7a06ab5ee4aa2776b2c7b) ... [DONE]
[SKIPPED] Wiki
 * xzsnrmyy/shannanwindow (@hashed/8e/61/8e612bd1f5d132a339575b8dafb7842c64614e56bcf3d5ab65a0bc4b34329407) ... [DONE]
[SKIPPED] Wiki
 * cdzlzb/php (@hashed/04/30/043066daf2109523a7490d4bfad4766da5719950a2b5f96d192fc0537e84f32a) ... [DONE]
[SKIPPED] Wiki
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping uploads ... 
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping builds ... 
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping artifacts ... 
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping pages ... 
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping lfs objects ... 
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping container registry images ... 
2021-06-19 14:30:58 +0800 -- [DISABLED]
Creating backup archive: 1624084258_2021_06_19_13.1.1-ee_gitlab_backup.tar ... done
Uploading backup archive to remote storage  ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... skipping
Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data 
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
Backup task is done.
[root@localhost ~]# 

末尾的警告提示为:没有自动备份 gitlab.rb 和 gitlab-secrets.json 这两个文件,需要备份。可手动备份,路径在 /etc/gitlab 下


02、查看备份文件


使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1530156812_2018_06_28_10.8.4_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1530156812_2018_06_28_10.8.4是备份创建的日期。通过xftp可以拷贝到其他电脑上


二、inotify+rsync 远程备份

让gitlab定时运行它自己的备份任务,他会把库中所有项目信息和权限管理等信息,打包备份成一个压缩包。可以通过gitlab的自带命令导回去(gitlab程序版本必须完全一致)。

然后让inotify实时监控gitlab的备份目录,在备份目录发生变化时,告知rsync,让它以增量方式实时同步到远端存储(windows共享)上。

rsync除了增量方式,安全起见,再写一个定时任务,比如每2小时就全量备份同步一次。

2.1 windows安装cwRsyncserver


01、安装cwRsyncserver

从网上搜索cwRsyncServer_4.1.0_Installer.exe或者通过下方连接在CSDN资源上下载,在windows下进行安装。我选择的是默认安装位置:C:\\Program Files (x86)\\ICW,安装时会给windows创建一个账号,默认是SvcCWRSYNC,密码我们设定为123456。
注意:上面的安装的地址和初始密码的设定很重要,一定要牢记
02、配置cwRsyncserver

打开 ``C:\\Program Files (x86)\\ICW`` 安装目录下的rsyncd.conf文件,编辑同步服务器(同步目的)的配置信息
use chroot = false
strict modes = false
hosts allow = * #允许所有主机连接
#指定日志文件输出位置,下面地址为:e:\\synch_backup_home\\rsyncd.log
log file = /cygdrive/e/synch_backup_home/rsyncd.log
 
uid = 0 # 需要配置此项,不然连接报错
gid = 0 # 需要配置此项,不然连接报错
 
#新增自己的库配置信息
#自定义库名称,客户端连接时需指定这个名字
[syn_git_repo]
#仓库位置,对应本机为:e:\\synch_backup_home\\gitlabbuckup
path = /cygdrive/e/synch_backup_home/gitlabbuckup
#可读可写
read only = false
#输出日志
transfer logging = yes
#不允许客户端列出服务端的信息
#list = no
# 对应配置用户名
auth users = SvcCWRSYNC
#指定密码文件的位置,本机为:e:\\synch_backup_home\\rsync.passwd
secrets file = /cygdrive/e/synch_backup_home/rsync.passwd

# ————————————默认的配置文件————————————
#use chroot = false
#strict modes = false
#hosts allow = *
#log file = rsyncd.log

# Module definitions
# Remember cygwin naming conventions : c:\\work becomes /cygwin/c/work
#
#[test]
#path = /cygdrive/c/work
#read only = false
#transfer logging = yes

[syn_git_repo]为自定义的服务端仓库名称,客户端(Centos7备份源)连接时需指定这个库的名称。

rsync.passwd文件中内容为:SvcCWRSYNC:123456

SvcCWRSYNC为备份时鉴权使用的账号名。123456为密码。


03、rsync.passwd配置

在02步,我们看见了有一个 rsync.passwd 的配置,此处,一定要注意。不然后续悔一直连接不上,提示没有权限。

04、备份目的文件夹授权

为了防止客户端向服务器中备份文件时没有权限,按照网上的建议,我们把备份目的文件夹,也就是上面指定的仓库目录“E:\\synch_backup_home\\shared_repository”进行共享,并赋予SvcCWRSYNC用户所有权限。(有的教程中无此项配置,我为了以防万一还是授权了)

05、重启rsync服务

修改完配置文件后,我们打开计算机的服务页面,在里面找到名为“RsyncServer”的服务。

把它设定为开机自动启动,然后重启它。

到此为止,windows服务器(备份目的)端就配置完毕了

2.2 Centos7(备份源),安装inotify和rsync客户端


01、修改gitlab配置文件

vim /etc/gitlab/gitlab.rb

找到备份相关的两项,如果没有在可在尾部自行增加即可,进行修改:

#auto gitlab backups
#置文件来修改默认存放备份文件的目录,以下为默认地址
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
#备份文件保存时间,单位是秒,默认是2天
gitlab_rails['backup_keep_time'] = 172800

修改完毕后保存退出,之后让gitlab重新配置一下:

gitlab-ctl reconfigure #重新配置
gitlab-ctl restart #重启gitlab服务

gitlab-ctl reconfigure
gitlab-ctl restart

02、安装inotify和rsync客户端

接下来,该准备安装之前所说的“inotify(文件实时监控)+rsync(文件实时同步)的综合解决方案”所需的这两个命令了。
安装 inotify

方式一:通过 yum 安装
yum install inotify-tools -y

若提示找不到软件,则需先安装Centos7的扩展安装源:

yum install epel-release

方式二:通过rpm文件安装
注:自己通过以上方式没能成功安装,后续采用通过 rpm格式进行成功安装

将二进制的rpm(inotify-tools-3.14-9.el7.x86_64.rpm)拷贝到centos设别上,执行一下命令,我自己存在路劲给为 ``/home/soft_storge``

[root@localhost soft_storge]# rpm -ivh inotify-tools-3.14-9.el7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:inotify-tools-3.14-9.el7         ################################# [100%]
[root@localhost soft_storge]# rpm -qa inotify-tools
inotify-tools-3.14-9.el7.x86_64
[root@localhost soft_storge]# 

安装rsync客户端

yum -y install rsync

03、centos上创建密钥

在Centos7中再创建一个rsync.passwd文件,用于同步时指定密码。

我创建到了“/home/synch_backup_home/rsync.passwd”,文件中的内容为:123456


04、测试是否可成功同步

在配置的备份目录中/var/opt/gitlab/backups 创建几个文本或者执行一次gitlab的备份 ,难得创建。

然后运行下面的命令,开始全量同步测试:

rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo

运行成功结果

[root@localhost soft_storge]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo
sending incremental file list
./
1627996113_2021_08_03_13.1.1-ee_gitlab_backup.tar

sent 4,112,522,341 bytes  received 41 bytes  14,873,498.67 bytes/sec
total size is 4,119,470,080  speedup is 1.00
[root@localhost soft_storge]# 

上面命令中的几个参数说明:

“--password-file=/home/synch_backup_home/rsync.passwd”参数指定同步时的连接密码文件位置(里面是123456)。

上面参数紧跟着的“/var/opt/gitlab/backups/”,为备份源文件夹位置,请加上最后的“/”,否则会在目的文件夹根目录中再创建一个名为“shared_repository”的文件夹。

最后的参数“SvcCWRSYNC@192.168.0.107::syn_git_repo”分为3段:
第一段“SvcCWRSYNC”为对应服务器端的用户名;
第二段“192.168.2.165”为rsync服务器地址(备份目的);
第三段“syn_git_repo”为rsync服务器端配置的自定义仓库名称(与上面rsyncd.conf文件的配置对应)。
05、编辑增量实时同步脚本

为了做到按需实时同步有变化的文件(rsync增量同步),需要配合使用inotify实时监控和rsync的增量同步。

因此,我们需要编写一个sh脚本文件,并在开机时启动它(开机后自动开始监控功能)。

我们在“/home/synch_backup_home/”目录中,编辑增量实时同步脚本“inotify_start.sh”,内容如下(在此感谢第一个编写如下脚本的朋友,我只是做了略微调整):

#!/bin/bash
#
#先定义脚本中所需各种变量
src=/var/opt/gitlab/backups          # 需要同步的源路径
log_file=/home/synch_backup_home/rsync.log  #日志输出文件路径
#
do
        INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
        echo $file
        #增加、修改、写入完成、移动进事件
        then
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                                #INO_FILE变量代表路径哦  -c校验文件内容
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}
                 #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文
件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)>后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
        fi
        #删除、移动出事件
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
                echo 'DELETE or MOVED_FROM'
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}
                #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是>被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路
径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
        fi
        #修改属性事件 指 touch chgrp chmod chown等操作
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo 'ATTRIB'
                if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归>扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                then
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}
                fi
        fi

                #记录日志
                echo "${file} was rsynced at $(date "+%Y%m%d-%H%M%S")" >>${log_file} 2>&1
done

记得给inotify_start.sh添加运行权限:

chmod 500 inotify_start.sh

上面权限设置为,仅对当前用户能够读取和执行(避免被修改)。
很遗憾,以上脚本可以运行起来,但是未能执行远程备份操作


06、开启定时任务,启动所有功能

到此为止,windows端具备了同步服务的能力,Centos7我们也具备了同步gitlab备份仓库的能力,只差自动运行了。

因此,我们通过Centos7的crontab定时任务,来完成开机启用实时备份、同步的能力。

crontab -e

按“i”进入编辑模式,在其中增加定时任务,我把我整个定时任务全部贴出来,仅供参考:

#在开机后,等待25秒后,开始运行实时同步备份脚本
@reboot (sleep 25;sh /home/synch_backup_home/inotify_start.sh)

#每天23:30运行一次gitlab仓库的全量的同步,并在前面添加开始时间、后面添加结束时间  
30 23 * * * (/usr/bin/date "+\\%Y\\%m\\%d-\\%H\\%M\\%S full backup begin:";/usr/bin/rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo;/usr/bin/date "+\\%Y\\%m\\%d-\\%H\\%M\\%S full backup end!") >>/home/synch_backup_home/full_backup.log 2>&1

#每天在23的时候,开始运行gitlab的备份功能
00 23 * * * /usr/bin/gitlab-rake gitlab:backup:create

为了避免备份遗漏,建议还是加上定时全量备份。

增量备份的日志会输出到“/home/synch_backup_home/rsync.log”中。

全量备份的日志会输出到“/home/synch_backup_home/full_backup.log”中。


三、问题记录


01、Connection timed out (110)

[root@localhost ~]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::gitlabbuckup
@ERROR: Unknown module 'gitlabbuckup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]

在连接执行远程备份的时候,提示连接超时。后续发现问在windows服务端上,自己开启了防火墙,需要将在windows防火墙中放开 873 端口


02、Unknown module 'gitlabbuckup'

[root@localhost ~]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::gitlabbuckup
@ERROR: Unknown module 'gitlabbuckup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]

发现为最后一个参数写错,参数为服务器端中,配置文件的标题


03、password file must not be other-accessible

[root@localhost ~]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
[root@localhost ~]# 

发现为其文件权限不正确,修改文件权限。自己密码文件直接在windows上创建后拖入,没有修改权限,需要参照下方修改权限,设置为仅自己可读可写。

[root@localhost home]# cd ./synch_backup_home
[root@localhost synch_backup_home]# ls
rsync.passwd
[root@localhost synch_backup_home]# ll | grep rsync.passwd
-rw-r--r--. 1 root root 8 811 17:48 rsync.passwd
[root@localhost synch_backup_home]# chmod 600 rsync.passwd
[root@localhost synch_backup_home]# ll | grep rsync.passwd
-rw-------. 1 root root 8 811 17:48 rsync.passwd
[root@localhost synch_backup_home]# 

04、auth failed on module syn_git_repo

[root@localhost synch_backup_home]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo
@ERROR: auth failed on module syn_git_repo
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]

windows服务器日志

2021/08/12 13:35:41 [8720] rsyncd version 3.0.8 starting, listening on port 873
2021/08/12 13:36:12 [3460] name lookup failed for 192.168.2.166: hostname nor servname provided, or not known
2021/08/12 13:36:12 [3460] connect from UNKNOWN (192.168.2.166)
2021/08/12 13:36:12 [3460] auth failed on module syn_git_repo from unknown (192.168.2.166): missing secret for user "SvcCWRSYNC"

以上问题,主要未没有在windows创建密码文件。需要以下处理方式

  1. 在windows上的文件夹进行共享
  2. 在windows服务端密码文件,需要按照 user:password的方式配置

05、/bin/bash^M: 坏的解释器: 没有那个文件或目录

[root@localhost ~]# sh /home/synch_backup_home/inotify_start.sh
/home/synch_backup_home/inotify_start.sh:行2: $'\\r': 未找到命令
/home/synch_backup_home/inotify_start.sh:行10: $'\\r': 未找到命令
/home/synch_backup_home/inotify_start.sh:行28: 条件表达式中有语法错误
' 附近有语法错误up_home/inotify_start.sh:行28: `]]
'home/synch_backup_home/inotify_start.sh:行28: `        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
[root@localhost ~]# 

对脚本进行 路径的执行时,提示如上错误

[root@localhost synch_backup_home]# ./inotify_start.sh
-bash: ./inotify_start.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
[root@localhost synch_backup_home]# 

进入路径直接运行时,提示如上错误

其实两者都是一个问题导致,只是不同的运行方式导致不同的提示。问题为自己是在windows上编辑后,直接放入centos上,文件的换行在windows为 \\r\\n 而 在centos 为 \\n 而导致。其中 \\r 在centos上显示为 ^M

centos内容显示

[root@localhost synch_backup_home]# cat -A inotify_start.sh
#!/bin/bash^M$
#^M$
#M-eM-^EM-^HM-eM-.M-^ZM-dM-9M-^IM-hM-^DM-^ZM-fM-^\\M-,M-dM-8M--M-fM-^IM-^@M-iM-^\\M-^@M-eM-^PM-^DM-gM-'M-^MM-eM-^OM-^XM-iM-^GM-^O^M$
src=/var/opt/gitlab/backups          # M-iM-^\\M-^@M-hM-&M-^AM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-fM-:M-^PM-hM-7M-/M-eM->M-^D^M$
des=syn_git_repo                             # M-gM-^[M-.M-fM- M-^GM-fM-^\\M-^MM-eM-^JM-!M-eM-^YM-(M-dM-8M-^J rsync --daemon M-eM-^OM-^QM-eM-8M-^CM-gM-^ZM-^DM-eM-^PM-^MM-gM-'M-0M-oM-<M-^Lrsync --daemonM-hM-?M-^YM-iM-^GM-^LM-eM-0M-1M-dM-8M-^MM-eM-^AM-^ZM-dM-;M-^KM-gM-;M-^MM-dM-:M-^FM-oM-<M-^LM-gM-=M-^QM-dM-8M-^JM-fM-^PM-^\\M-dM-8M-^@M-dM-8M-^KM-oM-<M-^LM-fM-/M-^TM-hM->M-^CM-gM-.M-^@M-eM-^MM-^UM-cM-^@M-^B^M$
rsync_passwd_file=/home/synch_backup_home/rsync.passwd            # rsyncM-iM-*M-^LM-hM-/M-^AM-gM-^ZM-^DM-eM-/M-^FM-gM- M-^AM-fM-^VM-^GM-dM-;M-6^M$
server_ip=192.168.2.165                 # M-gM-^[M-.M-fM- M-^GM-fM-^\\M-^MM-eM-^JM-!M-eM-^YM-(^M$
user=SvcCWRSYNC                         # rsync --daemonM-eM-.M-^ZM-dM-9M-^IM-gM-^ZM-^DM-iM-*M-^LM-hM-/M-^AM-gM-^TM-(M-fM-^HM-7M-eM-^PM-^M^M$
log_file=/home/synch_backup_home/rsync.log  #M-fM-^WM-%M-eM-?M-^WM-hM->M-^SM-eM-^GM-:M-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^D^M$
#^M$
cd ${src}                               # M-fM--M-$M-fM-^VM-9M-fM-3M-^UM-dM-8M--M-oM-<M-^LM-gM-^TM-1M-dM-:M-^NrsyncM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-gM-^IM-9M-fM-^@M-'M-oM-<M-^LM-hM-?M-^YM-iM-^GM-^LM-eM-?M-^EM-iM-!M-;M-hM-&M-^AM-eM-^EM-^HcdM-eM-^HM-0M-fM-:M-^PM-gM-^[M-.M-eM-=M-^UM-oM-<M-^LinotifyM-eM-^FM-^MM-gM-^[M-^QM-eM-^PM-, ./ M-fM-^IM-^MM-hM-^CM-=rsyncM-eM-^PM-^LM-fM--M-%M-eM-^PM-^NM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-dM-8M-^@M-hM-^GM-4M-oM-<M-^LM-fM-^\\M-^IM-eM-^EM-4M-hM-6M-#M-gM-^ZM-^DM-eM-^PM-^LM-eM--M-&M-eM-^OM-/M-dM-;M-%M-hM-?M-^[M-hM-!M-^LM-eM-^PM-^DM-gM-'M-^MM-eM-0M-^]M-hM-/M-^UM-hM-'M-^BM-gM-^\\M-^KM-eM-^EM-6M-fM-^UM-^HM-fM-^^M-^\\^M$
/usr/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file         # M-fM-^JM-^JM-gM-^[M-^QM-fM-^NM-'M-eM-^HM-0M-fM-^\\M-^IM-eM-^OM-^QM-gM-^TM-^_M-fM-^[M-4M-fM-^TM-9M-gM-^ZM-^D"M-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^DM-eM-^HM-^WM-hM-!M-("M-eM->M-*M-gM-^NM-/^M$
do^M$
        INO_EVENT=$(echo $file | awk '{print $1}')      # M-fM-^JM-^JinotifyM-hM->M-^SM-eM-^GM-:M-eM-^HM-^GM-eM-^IM-2 M-fM-^JM-^JM-dM-:M-^KM-dM-;M-6M-gM-1M-;M-eM-^^M-^KM-iM-^CM-(M-eM-^HM-^FM-hM-5M-^KM-eM-^@M-<M-gM-;M-^YINO_EVENT^M$
        INO_FILE=$(echo $file | awk '{print $2}')       # M-fM-^JM-^JinotifyM-hM->M-^SM-eM-^GM-:M-eM-^HM-^GM-eM-^IM-2 M-fM-^JM-^JM-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^DM-iM-^CM-(M-eM-^HM-^FM-hM-5M-^KM-eM-^@M-<M-gM-;M-^YINO_FILE^M$
        echo "-------------------------------$(date)------------------------------------"^M$
        echo $file^M$
        #M-eM-"M-^^M-eM-^JM- M-cM-^@M-^AM-dM-?M-.M-fM-^TM-9M-cM-^@M-^AM-eM-^FM-^YM-eM-^EM-%M-eM-.M-^LM-fM-^HM-^PM-cM-^@M-^AM-gM-'M-;M-eM-^JM-(M-hM-?M-^[M-dM-:M-^KM-dM-;M-6^M$
        #M-eM-"M-^^M-cM-^@M-^AM-fM-^TM-9M-fM-^TM->M-eM-^\\M-(M-eM-^PM-^LM-dM-8M-^@M-dM-8M-*M-eM-^HM-$M-fM-^VM--M-oM-<M-^LM-eM-^[M- M-dM-8M-:M-dM-;M-^VM-dM-;M-,M-iM-^CM-=M-hM-^BM-/M-eM-.M-^ZM-fM-^XM-/M-iM-^RM-^HM-eM-/M-9M-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-fM-^SM-^MM-dM-=M-^\\M-oM-<M-^LM-eM-^MM-3M-dM-=M-?M-fM-^XM-/M-fM-^VM-0M-eM-;M-:M-gM-^[M-.M-eM-=M-^UM-oM-<M-^LM-hM-&M-^AM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-dM-9M-^_M-eM-^OM-*M-fM-^XM-/M-dM-8M-^@M-dM-8M-*M-gM-)M-:M-gM-^[M-.M-eM-=M-^UM-oM-<M-^LM-dM-8M-^MM-dM-<M-^ZM-eM-=M-1M-eM-^SM-^MM-iM-^@M-^_M-eM-:M-&M-cM-^@M-^B^M$
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # M-eM-^HM-$M-fM-^VM--M-dM-:M-^KM-dM-;M-6M-gM-1M-;M-eM-^^M-^K^M$
        then^M$
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'^M$
^I^I^I^I#INO_FILEM-eM-^OM-^XM-iM-^GM-^OM-dM-;M-#M-hM-!M-(M-hM-7M-/M-eM->M-^DM-eM-^SM-&  -cM-fM- M-!M-iM-*M-^LM-fM-^VM-^GM-dM-;M-6M-eM-^FM-^EM-eM-.M-9^M$
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}^M$
                 #M-dM-;M-^TM-gM-;M-^FM-gM-^\\M-^K M-dM-8M-^JM-iM-^]M-"M-gM-^ZM-^DrsyncM-eM-^PM-^LM-fM--M-%M-eM-^QM-=M-dM-;M-$ M-fM-:M-^PM-fM-^XM-/M-gM-^TM-(M-dM-:M-^F$(dirname ${INO_FILE})M-eM-^OM-^XM-iM-^GM-^O M-eM-^MM-3M-fM-/M-^OM-fM-,M-!M-eM-^OM-*M-iM-^RM-^HM-eM-/M-9M-fM-^@M-'M-gM-^ZM-^DM-eM-^PM-^LM-fM--M-%M-eM-^OM-^QM-gM-^TM-^_M-fM-^TM-9M-eM-^OM-^XM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^U(M-eM-^OM-*M-eM-^PM-^LM-fM--M-%M-gM-^[M-.M-fM- M-^GM-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-fM-^VM-9M-fM-3M-^UM-eM-^\\M-(M-gM-^TM-^_M-dM-:M-'M-gM-^NM-/M-eM-"M-^CM-gM-^ZM-^DM-fM-^_M-^PM-dM-:M-^[M-fM-^^M-^AM-gM-+M-/M-gM-^NM-/M-eM-"M-^CM-dM-8M-^KM-dM-<M-^ZM-fM-<M-^OM-fM-^VM-^GM-dM-;M-6 M-gM-^NM-0M-eM-^\\M-(M-eM-^OM-/M-dM-;M-%M-eM-^\\M-(M-dM-8M-^MM-fM-<M-^OM-fM-^VM-^GM-dM-;M-6M-dM-8M-^KM-dM-9M-^_M-fM-^\\M-^IM-dM-8M-^MM-iM-^TM-^YM-gM-^ZM-^DM-iM-^@M-^_M-eM-:M-& M-eM-^AM-^ZM-eM-^HM-0M-eM-9M-3M-hM-!M-!) M-gM-^DM-6M-eM-^PM-^NM-gM-^TM-(-RM-eM-^OM-^BM-fM-^UM-0M-fM-^JM-^JM-fM-:M-^PM-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-iM-^@M-^RM-eM-=M-^RM-eM-^HM-0M-gM-^[M-.M-fM- M-^GM-eM-^PM-^NM-iM-^]M-" M-dM-?M-^]M-hM-/M-^AM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-dM-8M-^@M-hM-^GM-4M-fM-^@M-'^M$
        fi^M$
        #M-eM-^HM- M-iM-^YM-$M-cM-^@M-^AM-gM-'M-;M-eM-^JM-(M-eM-^GM-:M-dM-:M-^KM-dM-;M-6^M$
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]^M$
        then^M$
                echo 'DELETE or MOVED_FROM'^M$
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}^M$
                #M-gM-^\\M-^KrsyncM-eM-^QM-=M-dM-;M-$ M-eM-&M-^BM-fM-^^M-^\\M-gM-^[M-4M-fM-^NM-%M-eM-^PM-^LM-fM--M-%M-eM-7M-2M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-hM-7M-/M-eM->M-^D${INO_FILE}M-dM-<M-^ZM-fM-^JM-%no such or directoryM-iM-^TM-^YM-hM-/M-/ M-fM-^IM-^@M-dM-;M-%M-hM-?M-^YM-iM-^GM-^LM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-fM-:M-^PM-fM-^XM-/M-hM-"M-+M-eM-^HM- M-fM-^VM-^GM-dM-;M-6M-fM-^HM-^VM-gM-^[M-.M-eM-=M-^UM-gM-^ZM-^DM-dM-8M-^JM-dM-8M-^@M-gM-:M-'M-hM-7M-/M-eM->M-^DM-oM-<M-^LM-eM-9M-6M-eM-^JM- M-dM-8M-^J--deleteM-fM-^]M-%M-eM-^HM- M-iM-^YM-$M-gM-^[M-.M-fM- M-^GM-dM-8M-^JM-fM-^\\M-^IM-hM-^@M-^LM-fM-:M-^PM-dM-8M--M-fM-2M-!M-fM-^\\M-^IM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-oM-<M-^LM-hM-?M-^YM-iM-^GM-^LM-dM-8M-^MM-hM-^CM-=M-eM-^AM-^ZM-eM-^HM-0M-fM-^LM-^GM-eM-.M-^ZM-fM-^VM-^GM-dM-;M-6M-eM-^HM- M-iM-^YM-$M-oM-<M-^LM-eM-&M-^BM-fM-^^M-^\\M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-hM-7M-/M-eM->M-^DM-hM-6M-^JM-iM-^]M- M-hM-?M-^QM-fM- M-9M-oM-<M-^LM-eM-^HM-^YM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^UM-fM-^\\M-^HM-eM-$M-^ZM-oM-<M-^LM-eM-^PM-^LM-fM--M-%M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-fM-^SM-^MM-dM-=M-^\\M-eM-0M-1M-hM-6M-^JM-hM-^JM-1M-fM-^WM-6M-iM-^WM-4M-cM-^@M-^BM-hM-?M-^YM-iM-^GM-^LM-fM-^\\M-^IM-fM-^[M-4M-eM-%M-=M-fM-^VM-9M-fM-3M-^UM-gM-^ZM-^DM-eM-^PM-^LM-eM--M-&M-oM-<M-^LM-fM-,M-"M-hM-?M-^NM-dM-:M-$M-fM-5M-^AM-cM-^@M-^B^M$
        fi^M$
        #M-dM-?M-.M-fM-^TM-9M-eM-1M-^^M-fM-^@M-'M-dM-:M-^KM-dM-;M-6 M-fM-^LM-^G touch chgrp chmod chownM-gM--M-^IM-fM-^SM-^MM-dM-=M-^\\^M$
        if [[ $INO_EVENT =~ 'ATTRIB' ]]^M$
        then^M$
                echo 'ATTRIB'^M$
                if [ ! -d "$INO_FILE" ]                 # M-eM-&M-^BM-fM-^^M-^\\M-dM-?M-.M-fM-^TM-9M-eM-1M-^^M-fM-^@M-'M-gM-^ZM-^DM-fM-^XM-/M-gM-^[M-.M-eM-=M-^U M-eM-^HM-^YM-dM-8M-^MM-eM-^PM-^LM-fM--M-%M-oM-<M-^LM-eM-^[M- M-dM-8M-:M-eM-^PM-^LM-fM--M-%M-gM-^[M-.M-eM-=M-^UM-dM-<M-^ZM-eM-^OM-^QM-gM-^TM-^_M-iM-^@M-^RM-eM-=M-^RM-fM-^IM-+M-fM-^OM-^OM-oM-<M-^LM-gM--M-^IM-fM--M-$M-gM-^[M-.M-eM-=M-^UM-dM-8M-^KM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-eM-^OM-^QM-gM-^TM-^_M-eM-^PM-^LM-fM--M-%M-fM-^WM-6M-oM-<M-^LrsyncM-dM-<M-^ZM-iM-!M-:M-eM-8M-&M-fM-^[M-4M-fM-^VM-0M-fM--M-$M-gM-^[M-.M-eM-=M-^UM-cM-^@M-^B^M$
                then^M$
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}^M$
                fi^M$
        fi^M$
^I^I^M$
^I^I#M-hM-.M-0M-eM-=M-^UM-fM-^WM-%M-eM-?M-^W^M$
^I^Iecho "${file} was rsynced at $(date "+%Y%m%d-%H%M%S")" >>${log_file} 2>&1^M$
done^M$
[root@localhost synch_backup_home]# 

此问题我们可以通过 替换 的方式进行解决

sed -i 's/\\r$//' inotify_start.sh

替换后的内容

[root@localhost synch_backup_home]# sed -i 's/\\r$//' inotify_start.sh
[root@localhost synch_backup_home]# cat -A inotify_start.sh
#!/bin/bash$
#$
#M-eM-^EM-^HM-eM-.M-^ZM-dM-9M-^IM-hM-^DM-^ZM-fM-^\\M-,M-dM-8M--M-fM-^IM-^@M-iM-^\\M-^@M-eM-^PM-^DM-gM-'M-^MM-eM-^OM-^XM-iM-^GM-^O$
src=/var/opt/gitlab/backups          # M-iM-^\\M-^@M-hM-&M-^AM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-fM-:M-^PM-hM-7M-/M-eM->M-^D$
des=syn_git_repo                             # M-gM-^[M-.M-fM- M-^GM-fM-^\\M-^MM-eM-^JM-!M-eM-^YM-(M-dM-8M-^J rsync --daemon M-eM-^OM-^QM-eM-8M-^CM-gM-^ZM-^DM-eM-^PM-^MM-gM-'M-0M-oM-<M-^Lrsync --daemonM-hM-?M-^YM-iM-^GM-^LM-eM-0M-1M-dM-8M-^MM-eM-^AM-^ZM-dM-;M-^KM-gM-;M-^MM-dM-:M-^FM-oM-<M-^LM-gM-=M-^QM-dM-8M-^JM-fM-^PM-^\\M-dM-8M-^@M-dM-8M-^KM-oM-<M-^LM-fM-/M-^TM-hM->M-^CM-gM-.M-^@M-eM-^MM-^UM-cM-^@M-^B$
rsync_passwd_file=/home/synch_backup_home/rsync.passwd            # rsyncM-iM-*M-^LM-hM-/M-^AM-gM-^ZM-^DM-eM-/M-^FM-gM- M-^AM-fM-^VM-^GM-dM-;M-6$
server_ip=192.168.2.165                 # M-gM-^[M-.M-fM- M-^GM-fM-^\\M-^MM-eM-^JM-!M-eM-^YM-($
user=SvcCWRSYNC                         # rsync --daemonM-eM-.M-^ZM-dM-9M-^IM-gM-^ZM-^DM-iM-*M-^LM-hM-/M-^AM-gM-^TM-(M-fM-^HM-7M-eM-^PM-^M$
log_file=/home/synch_backup_home/rsync.log  #M-fM-^WM-%M-eM-?M-^WM-hM->M-^SM-eM-^GM-:M-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^D$
#$
cd ${src}                               # M-fM--M-$M-fM-^VM-9M-fM-3M-^UM-dM-8M--M-oM-<M-^LM-gM-^TM-1M-dM-:M-^NrsyncM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-gM-^IM-9M-fM-^@M-'M-oM-<M-^LM-hM-?M-^YM-iM-^GM-^LM-eM-?M-^EM-iM-!M-;M-hM-&M-^AM-eM-^EM-^HcdM-eM-^HM-0M-fM-:M-^PM-gM-^[M-.M-eM-=M-^UM-oM-<M-^LinotifyM-eM-^FM-^MM-gM-^[M-^QM-eM-^PM-, ./ M-fM-^IM-^MM-hM-^CM-=rsyncM-eM-^PM-^LM-fM--M-%M-eM-^PM-^NM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-dM-8M-^@M-hM-^GM-4M-oM-<M-^LM-fM-^\\M-^IM-eM-^EM-4M-hM-6M-#M-gM-^ZM-^DM-eM-^PM-^LM-eM--M-&

以上是关于gitlab备份库局域网中远程备份至另一台windows电脑的主要内容,如果未能解决你的问题,请参考以下文章

想将ubuntu下某个文件夹下的文件定时上传至FTP或者共享文件夹,也可以直接传至另一台LINUX上使用。

linux服务器中如何登陆另一台Linux服务器中的Oracle数据库进行全库备份?

如何将sql数据库自动定时的备份或更新到另一台电脑

sql server 2008 如何实现数据库定时备份到局域网内另外一台服务器上

如何将本地数据库备份到另一台服务器上?

windows系统下,如何定期把本地文件夹备份到远程的另一台机子上?