#!/bin/bash #todo:运行前设置主机间SSH信任,将要更新的主机的IP放在mip中 #变量设置 #待更新主机ip存放在mip文件中 if [ ! -f mip ] then echo "mip doesn't exist" exit 1 fi ip=$(cat mip|awk '{print $1}') #远程登陆用户 user="root" #目标文件 tfile="/root/youfindthis" #目标路径 tpath="/root" #更新文件 pfile="/root/youupdate" #日志文件autoplog #获得总数并测试是否建立信任 s=0 for i in $ip do ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no $i "echo" if [ $? -eq 255 ] then ssh-copy-id $i fi s=`expr $s + 1` done ####LOG :log type message 日志记录 log() { local type=$1 local message=$2 case $type in ERROR) echo -e "\033[31m`date` ERROR : $message \033[0m" echo -e "\033[31m`date` ERROR : $message \033[0m">>autoplog ;; INFO) echo -e "\033[32m`date` INFO : $message \033[0m" echo -e "\033[32m`date` INFO : $message \033[0m">>autoplog ;; FAILED) echo -e "\033[34m`date` FAILED : $message\033[0m" echo -e "\033[34m`date` FAILED : $message \033[0m">>autoplog ;; WARNING) echo -e "\033[33m `date` WARNING : $message\033[0m" echo -e "\033[33m`date` WARNING : $message\033[0m">>autoplog ;; esac } ####### CHECK FILE######## checkfile user tfile ip 查找文件 checkfile() { local user=$1 local tfile=$2 local i=$3 check() { rm -f ."$i"findfin echo `ssh -t -p 22 $user@$i "if [ -f $tfile ]; then echo "exist";else echo "notexist";fi"` ssh -t -p 22 $user@$i "if [ -f $tfile ]; then echo "exist";else echo "notexist";fi" if [ $? -eq 0 ] then touch ."$i"findfin fi } local fexist=`check &` sleep 1 if [ ! -f ."$i"findfin ] then log ERROR "$user@$i ssh link failed" rm -f ."$i"findfin return 1 fi rm -f ."$i"findfin if [[ $fexist =~ "not" ]] then log FAILED "$user@$i :$tfile doesn't exist" return 2 else log INFO "$user@$i :$tfile exists" return 0 fi } ####### BACK UP ######### backup user tfile ip 备份文件 backup() { local user=$1 local tfile=$2 local i=$3 bp() { rm -f ."$i"backupfin echo `ssh -t -p 22 $user@$i "if mv $tfile $tfile.backup; then echo succeed;else echo failed;fi;"` touch ."$i"backupfin } local backupresult=`bp &` sleep 1 if [ ! -f ."$i"backupfin ] then log ERROR "$user@$i ssh link failed" rm -f ."$i"backupfin return 1 fi rm -f ."$i"backupfin if [[ $backupresult =~ "failed" ]] then log FAILED "$user@$i :$tfile backup failed!!!" return 1 else log INFO "$user@$i :$tfile backup succeeded! $tfile.backup" return 0 fi } #######DISTRIBUTE FILE######## distributefile user pfile ip tpath 发布文件 distributefile() { local user=$1 local pfile=$2 local i=$3 local tpath=$4 scp $pfile $user@$i:$tpath if [ $? -eq 0 ] then log INFO "$user@$i :$pfile update succeeded!" return 0 else log ERROR "$user@$i :$pfile update failed!" return 1 fi } #######autopackage####### autopackage user pfile ip tfile tpath 主流程 autopackage() { local user=$1 local pfile=$2 local i=$3 local tfile=$4 local tpath=$5 checkfile $user $tfile $i if [ $? -eq 0 ] then backup $user $tfile $i if [ $? -eq 0 ] then distributefile $user $pfile $i $tpath if [ $? -eq 0 ] then rm -f ."$i"updatefin touch ."$i"updatefin return 0 else return 1 fi else return 2 fi else return 3 fi } ######## MAIN ######## if [ ! -f autoplog ] then touch autoplog fi if [ ! -f $pfile ] then log WARNING "$pfile doesn't exist!!!!!!" exit 1 fi for i in $ip do autopackage $user $pfile $i $tfile $tpath & done wait #统计信息 scount=0 fcount=0 rm -f .failedip touch .failedip for i in $ip do if [ -f ."$i"updatefin ] then let "scount+=1" rm -f ."$i"updatefin else echo $i>>.failedip let "fcount+=1" fi done echo echo "=====total:$s succeeded:$scount failed:$fcount=====" if [ ! $fcount -eq 0 ] then echo echo "failed list" cat .failedip fi echo echo "log has been recorded in `pwd`/autoplog" echo