• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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

    您可能感兴趣的文章:
    • 简析Linux中如何改变文件或目录的访问权限
    • linux find下如何统计一个目录下的文件个数以及代码总行数的命令
    • Linux 用cp和rsync同步文件时跳过指定目录的方法
    • 解析linux 文件和目录操作的相关函数
    • linux修改目录和文件权限的简单命令解释
    • 一个监控LINUX目录和文件变化的Shell脚本分享
    • Linux下统计当前文件夹下的文件个数、目录个数
    • Linux中文件权限目录权限的意义及权限对文件目录的意义
    上一篇:Bash Shell中Shift用法分享
    下一篇:Bash的For循环(根据每次递增的数)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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