基于shell实现向多台服务器拷贝hosts文件

系统运维 waitig 444℃ 百度已收录 0评论

写这个脚本的目的是在生产环境中向多个服务器拷贝hosts文件,能满足自己的使用要求。

注意:

需要安装expect

#!/bin/bash
##########################################################
#
# Copyright (2017-10-21, )
#
# Author: charnet1019@163.com
# Last modified: 2017-10-22 00:06
# Description: 
#
##########################################################

# definition IP dictionary array
declare -A IPListDict

# 所有主机默认使用root帐号
USERNAME=root
# 本地要拷贝的文件
LOCAL="/etc/hosts"
# 拷贝到远程主机的位置
REMOTE="/tmp"

# 主机IP地址和密码,每行一个主机
IPListDict=(
[192.168.2.2]="secret"
)

ssh_key_base_dir=~/.ssh
ssh_known_hosts=$ssh_key_base_dir/known_hosts
SCP=/usr/bin/scp

DATETIME=`date "+%F %T"`

success() {
    printf "\r[ \033[00;32m$DATETIME INFO\033[0m ]%s\n" "$1"
}

warn() {
    printf "\r[\033[0;33m$DATETIME WARNING\033[0m]%s\n" "$1"
}

fail() {
    printf "\r[ \033[0;31m$DATETIME ERROR\033[0m ]%s\n" "$1"
}

usage() {
    echo "Usage: ${0##*/} {info|warn|err} MSG"
}

log() {
    if [ $# -lt 2 ]; then
        log err "Not enough arguments [$#] to log."
    fi

    __LOG_PRIO="$1"
    shift
    __LOG_MSG="$*"

    case "${__LOG_PRIO}" in
        crit) __LOG_PRIO="CRIT";;
        err) __LOG_PRIO="ERROR";;
        warn) __LOG_PRIO="WARNING";;
        info) __LOG_PRIO="INFO";;
        debug) __LOG_PRIO="DEBUG";;
    esac

    if [ "${__LOG_PRIO}" = "INFO" ]; then
        success " $__LOG_MSG"
    elif [ "${__LOG_PRIO}" = "WARNING" ]; then
        warn " $__LOG_MSG"
    elif [ "${__LOG_PRIO}" = "ERROR" ]; then
        fail " $__LOG_MSG"
    else
       usage
    fi
}

#is_exist_hosts() {
#    local FILE=$1
#
#    [ -f ${FILE} ] && return 0 || return 1
#}

get_cipher() {
    local IP=$1

    for key in ${!IPListDict[@]}; do
        if [[ X"$IP" == X"$key" ]]; then
            PASSWORD="${IPListDict[$key]}"
        fi
    done
}

# main
for ip in ${!IPListDict[@]}; do
    get_cipher $ip
    expect -c  <<- EOF &> /dev/null "
        spawn $SCP -r $LOCAL $USERNAME@$ip:$REMOTE
        expect {
            \"(yes/no)?\" {
                send \"yes\r\"
                expect {
                    "*assword" {
                        send \"$PASSWORD\r\"
                    }
                }
            }

            "*assword*" {
                send \"$PASSWORD\r\"
            }
            expect "100%"
            expect eof    
        }
        catch wait retVal
        exit [lindex \$retVal 3]"
EOF

    if [ $? -eq 0 ]; then
        log info "The file $LOCAL copy to the remote host $ip successed."
    else
        log err "The file $LOCAL copy to the remote host $ip failed." 
    fi     
done


本文由【waitig】发表在等英博客
本文固定链接:基于shell实现向多台服务器拷贝hosts文件
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)