详解Linux运维CentOS系统SVN双备份Shell脚本
<p><strong>前言</strong></p>
<p>
SVN是Subversion的简称,是一个开放源代码的版本控制系统,采用了分支管理系统。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。</p>
<p>
作为一个代码管理工具,备份操作显得尤为重要,这里采取这样的备份策略:在执行本地备份的同时,让Shell脚本自动上传数据到另一台FTP备份服务器中,这种异地备份策略成本比较小,无需存储,而且安全系统高,想到与双备份,本地和异地同时出现数据损坏的概率是低很多的。</p>
<p>
<strong>备份策略说明</strong></p>
<p>
使用CentOS 6系列系统,安装vsftpd,修改配置参数。此外vsftpd的备份目录可以做RAID1或RAID5。<br>
执行脚本将svn项目进行本地目录备份,然后将备份文件上传到FTP服务器上,已实现双备份。</p>
<p>
<strong>备份步骤</strong></p>
<p>
安装并配置vsftpd</p>
<p>
使用yum直接安装即可。</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_367713">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">yum -y </code><code class="bash functions">install</code> <code class="bash plain">vsftpd</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
修改配置,由于要进行上传操作,所以要允许用户上传。为安全性考虑,不建议匿名用户操作。</p>
<p>
修改配置后,将不必要的vsftpd.conf参数屏蔽,显示为:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_220103">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain"></code><code class="bash comments"># grep -v "^#" /etc/vsftpd/vsftpd.conf | grep -v "^$"</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain">anonymous_enable=NO</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash plain">local_enable=YES</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash plain">write_enable=YES</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash plain">local_umask=022</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash plain">dirmessage_enable=YES</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash plain">xferlog_enable=YES</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash plain">connect_from_port_20=YES</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash plain">xferlog_std_format=YES</code>
</div>
<div class="line number10 index9 alt1">
<code class="bash plain">chroot_local_user=YES</code>
</div>
<div class="line number11 index10 alt2">
<code class="bash plain">listen=YES</code>
</div>
<div class="line number12 index11 alt1">
<code class="bash plain">pam_service_name=vsftpd</code>
</div>
<div class="line number13 index12 alt2">
<code class="bash plain">userlist_enable=YES</code>
</div>
<div class="line number14 index13 alt1">
<code class="bash plain">tcp_wrappers=YES</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
chroot_local_user=YES这条语句需要重点强调一下,其作用是对用户登录权限进行限制,即所有本地用户登录vsftpd时只能在自己的家目录下,这是基于安全的考虑,本实例脚本也会基于这点,要是使用本脚本在实际的生产环境,需要注意该点。</p>
<p>
<strong>创建ftp登录用户</strong></p>
<p>
在备份服务器上创建备份用户,本次创建用户svn,并为其分配密码,还应该将其家目录更改为备份目录,本地备份目录为:/data/backup/svn-backup/,这样更方便备份工作,以下脚本以此类推。</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_957946">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain"></code><code class="bash comments"># useradd -d /data/backup/svn-backup/ svn</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain"></code><code class="bash comments"># echo "svnpasswd" | passwd --stdin svn</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash plain">Changing password </code><code class="bash keyword">for</code> <code class="bash plain">user svn.</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash functions">passwd</code><code class="bash plain">: all authentication tokens updated successfully.</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>配置svn仓库</strong></p>
<p>
首先检查操作系统上面是否安装了subversion,一般centos操作系统都默认安装了此软件,如果没有安装使用如下命令快速安装</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_492565">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">rpm -qa subversion</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain">yum -y </code><code class="bash functions">install</code> <code class="bash plain">subversion</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash comments">##创建版本库</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash plain">svnadmin create </code><code class="bash plain">/data/svn</code> <code class="bash plain">//</code><code class="bash plain">这里的文件目录自己随便设置 </code>
</div>
<div class="line number5 index4 alt2">
<code class="bash comments">##配置svnserve,上述版本库`/data/svn `建立后在文件夹下会生成conf文件夹,进入`/data/svn/conf`下面会有下面3个文件</code>
</div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
<code class="bash plain"></code><code class="bash comments"># ls conf/</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash plain">authz </code><code class="bash functions">passwd</code> <code class="bash plain">svnserve.conf </code>
</div>
<div class="line number9 index8 alt2">
</div>
<div class="line number10 index9 alt1">
<code class="bash comments">##需要修改`svnserve.conf`修改以下几个部分:</code>
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="bash plain">anon-access = </code><code class="bash functions">read</code>
</div>
<div class="line number13 index12 alt2">
<code class="bash plain">auth-access = write </code>
</div>
<div class="line number14 index13 alt1">
<code class="bash plain">password-db = </code><code class="bash functions">passwd</code>
</div>
<div class="line number15 index14 alt2">
<code class="bash plain">authz-db = authz </code>
</div>
<div class="line number16 index15 alt1">
</div>
<div class="line number17 index16 alt2">
<code class="bash comments">##修改`passwd`文件为:</code>
</div>
<div class="line number18 index17 alt1">
</div>
<div class="line number19 index18 alt2">
<code class="bash plain">[</code><code class="bash functions">users</code><code class="bash plain">] </code>
</div>
<div class="line number20 index19 alt1">
<code class="bash plain">username = password </code><code class="bash plain">//</code><code class="bash plain">这里的username和password自己设置 </code>
</div>
<div class="line number21 index20 alt2">
</div>
<div class="line number22 index21 alt1">
<code class="bash comments">##配置文件`authz`最后加上以下两行(这两行解决了 SVN客户端解决authorization failed问题)</code>
</div>
<div class="line number23 index22 alt2">
</div>
<div class="line number24 index23 alt1">
<code class="bash plain">[/] </code>
</div>
<div class="line number25 index24 alt2">
<code class="bash plain">* = rw </code>
</div>
<div class="line number26 index25 alt1">
</div>
<div class="line number27 index26 alt2">
<code class="bash comments">##启动svnserve即可:</code>
</div>
<div class="line number28 index27 alt1">
<code class="bash plain">svnserve -d -r </code><code class="bash plain">/home/myrepos/</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>备份脚本</strong></p>
<p>
本脚本设置轮询周期为30天一次,Shell会自动删除30天以前的文件。在vsftpd建立相应的备份用户svn脚本内容如下:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_131005">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash preprocessor bold">#!/bin/bash</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain">SVNDIR=</code><code class="bash string">"/data"</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash plain">SVNADMIN=</code><code class="bash string">"/usr/bin/svnadmin"</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash plain">DATE=$(</code><code class="bash functions">date</code> <code class="bash plain">+%Y-%m-%d)</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash plain">OLDDATE=$(</code><code class="bash functions">date</code> <code class="bash plain">+%Y-%m-%d -d</code><code class="bash string">'30 days'</code><code class="bash plain">)</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash plain">BACKDIR=</code><code class="bash string">"/data/backup/svn-backup"</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash plain">[ -d ${BACKDIR} ] || </code><code class="bash functions">mkdir</code> <code class="bash plain">-p ${BACKDIR}</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash plain">LogFile=${BACKDIR}</code><code class="bash plain">/svnbak</code><code class="bash plain">.log</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash plain">[ -f ${LogFile} ] || </code><code class="bash functions">touch</code> <code class="bash plain">${LogFile}</code>
</div>
<div class="line number10 index9 alt1">
<code class="bash functions">mkdir</code> <code class="bash plain">${BACKDIR}/${DATE}</code>
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="bash keyword">for</code> <code class="bash plain">PROJECT </code><code class="bash keyword">in</code> <code class="bash plain">svn</code>
</div>
<div class="line number13 index12 alt2">
<code class="bash keyword">do</code>
</div>
<div class="line number14 index13 alt1">
<code class="bash spaces"> </code><code class="bash functions">cd</code> <code class="bash plain">$SVNDIR</code>
</div>
<div class="line number15 index14 alt2">
<code class="bash spaces"> </code><code class="bash plain">$SVNADMIN hotcopy $PROJECT $BACKDIR/$DATE/$PROJECT --clean-logs</code>
</div>
<div class="line number16 index15 alt1">
<code class="bash spaces"> </code><code class="bash functions">cd</code> <code class="bash plain">$BACKDIR/$DATE</code>
</div>
<div class="line number17 index16 alt2">
<code class="bash spaces"> </code><code class="bash functions">tar</code> <code class="bash plain">zcvf ${PROJECT}_svn_${DATE}.</code><code class="bash functions">tar</code><code class="bash plain">.gz $PROJECT > </code><code class="bash plain">/dev/null</code>
</div>
<div class="line number18 index17 alt1">
<code class="bash spaces"> </code><code class="bash functions">rm</code> <code class="bash plain">-rf $PROJECT</code>
</div>
<div class="line number19 index18 alt2">
<code class="bash spaces"> </code><code class="bash functions">sleep</code> <code class="bash plain">2</code>
</div>
<div class="line number20 index19 alt1">
<code class="bash keyword">done</code>
</div>
<div class="line number21 index20 alt2">
</div>
<div class="line number22 index21 alt1">
<code class="bash plain">HOST=localhost</code>
</div>
<div class="line number23 index22 alt2">
<code class="bash plain">FTP_USERNAME=svn</code>
</div>
<div class="line number24 index23 alt1">
<code class="bash plain">FTP_PASSWORD=Haiyuan</code>
</div>
<div class="line number25 index24 alt2">
<code class="bash functions">cd</code> <code class="bash plain">${BACKDIR}/${DATE}</code>
</div>
<div class="line number26 index25 alt1">
</div>
<div class="line number27 index26 alt2">
<code class="bash functions">ftp</code> <code class="bash plain">-i -n -</code><code class="bash functions">v</code> <code class="bash plain"><<!</code>
</div>
<div class="line number28 index27 alt1">
<code class="bash functions">open</code> <code class="bash plain">${HOST}</code>
</div>
<div class="line number29 index28 alt2">
<code class="bash plain">user ${FTP_USERNAME} ${FTP_PASSWORD}</code>
</div>
<div class="line number30 index29 alt1">
<code class="bash plain">bin</code>
</div>
<div class="line number31 index30 alt2">
<code class="bash functions">cd</code> <code class="bash plain">${OLDDATE}</code>
</div>
<div class="line number32 index31 alt1">
<code class="bash plain">mdelete *</code>
</div>
<div class="line number33 index32 alt2">
<code class="bash functions">cd</code> <code class="bash plain">..</code>
</div>
<div class="line number34 index33 alt1">
<code class="bash functions">rmdir</code> <code class="bash plain">${OLDDATE}</code>
</div>
<div class="line number35 index34 alt2">
<code class="bash functions">mkdir</code> <code class="bash plain">${DATE}</code>
</div>
<div class="line number36 index35 alt1">
<code class="bash functions">cd</code> <code class="bash plain">${DATE}</code>
</div>
<div class="line number37 index36 alt2">
<code class="bash plain">mput *</code>
</div>
<div class="line number38 index37 alt1">
<code class="bash plain">bye</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。</p>
<p>
原文链接:http://blog.csdn.net/ll845876425/article/details/73011761</p>
頁:
[1]