linux批量备份服务器配置文件和目录的脚本

功能:
1. 只在备份机执行,远程的服务器只需要允许备份机用root通过密钥登录;
2. 在备份机上配置需要备份哪些服务器,在NEED_BACKUP_SERVERS这个数组增减;
3. 在备份机上配置需要备份服务器上哪些文件,在NEED_BACKUP_DETAIL这个数组增减,如果需要备份某台服务器上NEED_BACKUP_DETAIL数组里定义的某个文件就备份,不存在的文件则自动跳过,例如Web服务器上没my.cnf , 也没有影响;
4. 如果服务器上产生的新备份和已经存在已往备份内容一样则只保留时间较早的备份。因为服务器的配置文件不是经常改动的;
5. 通过修改定义KEEP_BACKUP_NUM为个变量,可以决定远程服务器上保留最近多少份备份,我这里定义的是10份。备份机上保留所有远程服务器的备份。因为配置文件都比较小,不用担心磁盘空间占用问题。

用过下列技术:
1. 获取远程服务器IP,如果某台服务器没有公网IP则使用该服务器的“主机名_IP.备份年月日_备份时间.tar.gz
2. 通过循环、判断,对数组中的元素重新赋值;

下载之后请留意版本号和更新日志。

代码如下:

#!/bin/bash
##################################################################
# Backup_Config_Files_Of_Remote_Servers
# Env: Centos 5.5 x86_64
# Created by Hernan on 2011-04-06
# Copyright 2010 __Chengyongxu.com__. All rights reserved.
#
# Version: 1.4.6
# Revision History
##################################################################

# Local Tmp Dir Of This Script
THIS_SCRIPT_TMP=/tmp/Do_at_remote_server.sh
THIS_SCRIPT_TMP_NAME=`echo $THIS_SCRIPT_TMP|awk -F/ '{print $NF}'`
# Local Backup Dir
LOCAL_BACKUP_DIR=/tmp/IDC_config_backup

# Need Backup Servers And Files List
REMOTE_SERVER_TMP_DIR=/tmp/Backup_server_config_files_tmp
NEED_BACKUP_SERVERS=(\
10.0.0.52
server_a_ip \
server_b_ip \
server_c_ip \
server_d_ip \
chengyongxu.com \
)
NEED_BACKUP_DETAIL=(\
/etc/hosts \
/etc/httpd/conf/*.conf \
/etc/httpd/conf.d/*.conf \
/etc/keepalived/keepalived.conf
/etc/my.cnf \
/etc/postfix \
/root/bin/*sh \
/usr/local/nagios/etc/nagios.cfg \
/usr/local/nagios/etc/objects/*cfg \
/usr/local/nginx/conf \
/usr/local/php/etc/php.ini \
/usr/local/php/etc/php-fpm.conf \
/usr/local/php-fcgi/etc/php.ini \
/usr/local/php-fcgi/etc/php-fpm.conf \
/usr/local/sphinx/etc/*.conf \
/var/spool/cron \
)
KEEP_BACKUP_NUM=10

SSH_PORT=22
SSH_USER=root

##################################################################
#
# Global Functions
#
##################################################################

#========= !!!! Warning ! Don't edit next function !!!! =========#
# Create Script Tmp File
Create_Script (){
cat << EOF > $THIS_SCRIPT_TMP
#!/bin/bash

NEED_BACKUP_DETAIL=(${NEED_BACKUP_DETAIL[*]})

# How many nums the backup needed
BAKNUM=$KEEP_BACKUP_NUM

REMOTE_SERVER_TMP_DIR=$REMOTE_SERVER_TMP_DIR
SERVER_IP=\`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^10.|^127|^172.16|^192.168"\`
BACKUP_TIME=\`date +%Y%m%d_%H%M\`

##################################################################
#
# Compress NEED_BACKUP_DETAIL
#
##################################################################
# If IPv4 private address only, use hostname.ip
if [ -z \$SERVER_IP ]
then
    SERVER_IP=\`hostname\`_\`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^127"|head -n 1\`
fi

# Create Tpm dir
if [ ! -d \$REMOTE_SERVER_TMP_DIR ]
then
    mkdir -p \$REMOTE_SERVER_TMP_DIR
fi

# Compress
for file in \${NEED_BACKUP_DETAIL[*]}
do
    # When you want to backup the file exists,
    #   assign to an element of the new array
    while [ -e \$file ]
    do
        NEED_BACKUP_DETAIL_EXISTS[\$num]=\$file
        let num++
    break
    done
done
tar zcfpP \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz \${NEED_BACKUP_DETAIL_EXISTS[*]}

##################################################################
#
# If files are the same,keep one only
#
##################################################################
NEW_BACKUP_ARCHIVE_CONTENT=\`tar tvf \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz\`
for backfile in \`ls \$REMOTE_SERVER_TMP_DIR | grep tar.gz |grep -v \$SERVER_IP.\$BACKUP_TIME\`
do
    OLD_BACKUP_ARCHIVE_CONTENT=\`tar tvf \$REMOTE_SERVER_TMP_DIR/\$backfile\`
    while [ "\$NEW_BACKUP_ARCHIVE_CONTENT" = "\$OLD_BACKUP_ARCHIVE_CONTENT" ]
    do
        rm -rvf \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz 1 >> \$REMOTE_SERVER_TMP_DIR/delete_new.log
    break
    done
done

##################################################################
#
# Keep Some Backup Files Newest
#
##################################################################
count=0
for name in \`ls \$BAKPATH/ |grep -E '[0-9]{6,6}' | sort -r\`
do
  count=\$((count+1))
  if [ \$count -gt \$BAKNUM ] ; then
    echo -n "Cleaning old backup: \$name... "
      if [ "\$BAKPATH/\$name" = "/" ] ; then
        echo "No rm -rf /!"
        exit 1
      fi
      rm -rf \$BAKPATH/\$name
    echo " Done."
  else
    echo "Keeping old backup: \$name"
  fi
done
exit
EOF
}

Copy_Script_To_Remote (){
for server in ${NEED_BACKUP_SERVERS[*]}
do
ssh -p $SSH_PORT -tt $SSH_USER@$server << EOT
mkdir -p $REMOTE_SERVER_TMP_DIR
exit
EOT
scp -P $SSH_PORT $THIS_SCRIPT_TMP $SSH_USER@$server:$REMOTE_SERVER_TMP_DIR/
done
}

Backup_On_Remote_Then_Copy_Back (){
for server in ${NEED_BACKUP_SERVERS[*]}
do
ssh -p $SSH_PORT -tt $SSH_USER@$server << EOP
chmod o+x $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME
sh $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME
rm -f $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME
exit
EOP
rsync -e "ssh -p $SSH_PORT" $SSH_USER@$server:$REMOTE_SERVER_TMP_DIR/*tar.gz $LOCAL_BACKUP_DIR/
done
}

##################################################################
#
# Main
#
##################################################################
#
Create_Script
Copy_Script_To_Remote
Backup_On_Remote_Then_Copy_Back
rm -rf $THIS_SCRIPT_TMP

(0)

相关推荐

  • Linux中文件权限目录权限的意义及权限对文件目录的意义

    linux中目录与文件权限的意义 一.文件权限的意义 r:可以读这个文件的具体内容: w:可以编辑这个文件的内容,包括增加删除文件的具体内容: x:文件就具有了可执行的权限-------注意:这里和window不一样,在win中,文件的可执行权限是通过扩展名表现出来的,如exe.bat等,但是在linux中文件的可执行权限是通过这个x决定的,与文件名没有什么关系. 二.目录权限的意义 r:可以查看此目录下的完整文件列表信息. w:可以对此目录下的所有的文件及目录进行相关的更改,也就是可以更改这个

  • 简析Linux中如何改变文件或目录的访问权限

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作.可执行权限表示允许将该文件作为一个程序执行.文件被创建时,文件所有者自动拥有对该文件的读.写和可执行权限,以便于对文件的阅读和修改.用户也可根据需要把访问权限设置为需要的任何组合. 有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户.其他用户.所有者一般是文件的

  • Linux 用cp和rsync同步文件时跳过指定目录的方法

    需求是:某测试站点,在某个节点的时候需要同步到正式站点去,但是里面的config目录不能覆盖, 方法一:终端命令行下执行以下命令 cp -R `find /projectA -type d -path /projectA/common/config -prune -o -print | sed 1d ` /projectB/ 方法二: localhost # find projectB/ommon/config | xargs touch 修改目标目录的congfig目录文件的access ti

  • Linux下统计当前文件夹下的文件个数、目录个数

    1) 统计当前文件夹下文件的个数 复制代码 代码如下: ls -l |grep "^-"|wc -l 2) 统计当前文件夹下目录的个数 复制代码 代码如下: ls -l |grep "^d"|wc -l 3) 统计当前文件夹下文件的个数,包括子文件夹里的 复制代码 代码如下: ls -lR|grep "^-"|wc -l 4) 统计文件夹下目录的个数,包括子文件夹里的 复制代码 代码如下: ls -lR|grep "^d"|w

  • linux find下如何统计一个目录下的文件个数以及代码总行数的命令

    今天遇到如题所示问题,网上捣鼓半天,有收获 知道指定后缀名的文件总个数命令:        find . -name "*.html" | wc -l 知道一个目录下代码总行数以及单个文件行数:        find . -name "*.html" | xargs wc -l

  • 一个监控LINUX目录和文件变化的Shell脚本分享

    最近看到群里有人聊到他们的服务器最近被挂马,然后想利用一个脚本能够实时监控web目录下文件的变化,也就是对该目录的增删改操作都会记录到相应日志下. 当时感觉这个功能的确实有点意思,所以网上查阅了些资料,自己研究了下,这会儿有空写了个脚本,分享给大家,如有问题,还请大家指出. 以下我写了两个脚本: 脚本1:将需要监控的目录的原始状态保存到LOG日志 脚本2:将脚本1的原始状态与本脚本比对,如果目录文件发生变化,则将变化的内容保存到日志. 注:原理实际上利用的是du -sb输出值来判断文件的变化,再

  • linux修改目录和文件权限的简单命令解释

    今天遇到的问题,如何一个用户如www的权限复制给我的用户? 目录的权限表示:dwrxr--r-- 其中第一个字符 d代表目录, -代表字符 w代表可写,r代表可读 x代表可执行 数字为4,2,1其中第一组是文件或者目录所有者权限,第二组代表当前用户所在用户组,第三组是其他用户组的权限所以控制文件的权限是精确到组的 用 chmod 权限 目录 复制代码 代码如下: chmod 777 testchmod u+w test

  • 解析linux 文件和目录操作的相关函数

    struct stat{mode_t    st_mode;    文件类型,文件权限ino_t     st_ino;        i节点号dev_t    st_dev;        dev_t    st_rdev;    设备文件序号nlink_t    st_nlink;    链接uid_t    st_uid;gid_t     st_gid;        用户IDoff_t    st_size;    文件大小,此字段只对普通文件.目录文件和符号连接有意义.time_t 

  • linux批量备份服务器配置文件和目录的脚本

    功能:1. 只在备份机执行,远程的服务器只需要允许备份机用root通过密钥登录:2. 在备份机上配置需要备份哪些服务器,在NEED_BACKUP_SERVERS这个数组增减:3. 在备份机上配置需要备份服务器上哪些文件,在NEED_BACKUP_DETAIL这个数组增减,如果需要备份某台服务器上NEED_BACKUP_DETAIL数组里定义的某个文件就备份,不存在的文件则自动跳过,例如Web服务器上没my.cnf , 也没有影响:4. 如果服务器上产生的新备份和已经存在已往备份内容一样则只保留时

  • linux下mysql如何自动备份shell脚本

    Linux 服务器上的程序每天都在更新 MySQL 数据库,于是就想起写一个 shell 脚本,结合 crontab,定时备份数据库.其实非常简单,主要就是使用 MySQL 自带的 mysqldump 命令. #!/bin/bash # Shell script to backup MySql database # To backup Nysql databases file to /backup dir and later pick up by your # script. You can s

  • 如何通过Linux命令行使用和运行PHP脚本

    下面通过图文并茂的方式给大家分享下通过Linux命令使用和运行PHP脚本. PHP是一个开源服务器端脚本语言,最初这三个字母代表的是"Personal Home Page",而现在则代表的是"PHP:Hypertext Preprocessor",它是个递归首字母缩写.它是一个跨平台脚本语言,深受C.C++和Java的影响. 在 Linux 命令行中运行 PHP 代码 PHP的语法和C.Java以及带有一些PHP特性的Perl变成语言中的语法十分相似,它当下大约正被

  • Linux 单个tomcat多实例部署shell脚本详解

    Linux 单个tomcat多实例部署shell脚本详解 步骤: 1. 下载tomcat,解压安装 2.将tomcat下的webapps,conf,temp等目录分别拷至根目录www下A,B,C目录下 3.新建如下脚本restart_tomcat.sh 4.使用restart_tomcat.sh A/B/C #!/bin/sh if [ -z $1 ] then echo "\033[31;1mplease input the app which you need restart...\033[

  • 详解Linux中查看jdk安装目录、Linux卸载jdk、rpm命令、rm命令参数

    一.查看jdk安装目录 [root@node001 ~]# whereis java java: /usr/bin/java /usr/local/java #java执行路径 [root@node001 ~]# which java /usr/bin/java #查看JDK安装路径 [root@node001 ~]# echo $JAVA_HOME /usr/local/java/jdk1.7.0_80 [root@node001 ~]# echo $PATH /usr/local/sbin:

  • node.js在Linux下执行shell命令、.sh脚本的问题

    首先,引入子进程模块 var process = require('child_process'); 执行shell命令 调用该模块暴露出来的方法exec process.exec('shutdown -h now',function (error, stdout, stderr) { if (error !== null) { console.log('exec error: ' + error); } }); //回调函数非必须! 执行.sh脚本 很多时候需要多个命令来完成一项工作,而这个工

  • Linux网络相关配置文件

    Linux网络相关配置文件 一 网络参数与配置文件对应关系 所需要的网络参数 主要配置文件命名 重要参数 IP Netmask DHCP Gateway等 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=网卡名称 BOOTPROTO=是否使用dhcp HWADDR = 是否加入网卡MAC地址 IPADDR = IP地址 NETMASK = 子网掩码 ONBOOT = 要不要默认启动此接口 GATEWAY = 网关地址 主机名 /etc/sysco

  • linux系统使用python获取cpu信息脚本分享

    linux系统使用python获取cpu信息脚本分享 复制代码 代码如下: #!/usr/bin/env Pythonfrom __future__ import print_functionfrom collections import OrderedDictimport pprint def CPUinfo():    ''' Return the information in /proc/CPUinfo    as a dictionary in the following format:

  • linux下判断文件和目录是否存在的方法(总结)

    1.前言 工作中涉及到文件系统,有时候需要判断文件和目录是否存在.我结合APUE第四章文件和目录,总结一下如何正确判断文件和目录是否存在,方便以后查询. 2.stat系列函数 stat函数用来返回与文件有关的结构信息.stat系列函数有三种情况,分别对应文件名称.文件描述符和符号链接文件.stat结构描述了文件的属性,主要包括文件的类型.文件大小等等.详细stat结构如下所示: struct stat { mode_t st_mode; // file type & mode(permissio

  • 实现自动清除日期目录shell脚本实例代码

    实现自动清除日期目录shell脚本实例代码 很多时候备份通常会使用到基于日期来创建文件夹,对于这些日期文件夹下面又有很多子文件夹,对于这些日期文件整个移除,通过find结合rm或者delete显得有些力不从心.本文提供一个简单的小脚本,可以嵌入到其他脚本,也可直接调用,如下文供大家参考. 1.脚本内容 [root@SZDB ~]# more purge_datedir.sh #!/bin/bash # Author: Leshami # Blog : http://blog.csdn.net/l

随机推荐