LazyManage运维批量Linux系统管理脚本

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

#!/bin/bash
#ShellName:LazyManage.sh
#Conf:serverlist.conf
#By:peter.li six
#2014-04-14
#LazyManage.sh version update address:
#http://hi.baidu.com/quanzhou722/item/4ccf7e88a877eaccef083d1a
#shell examples manual:
#http://hi.baidu.com/quanzhou722/item/f4a4f3c9eb37f02d46d5c0d9
#python examples manual:
#http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7

LANG="en_US.UTF-8"

while true
do

Set_Variable(){

	ServerList=serverlist.conf
	Port=22
	TimeOut="-1"
	Task=30

	RemoteUser='root'
	RemotePasswd='123456'
	RemoteRootUser='root'
	RemoteRootPasswd='xuesong'
	KeyPasswd=''

	ScpPath="lazy.tmp"
	ScpRemotePath="/tmp/"
	ScriptRemote="ScriptRemote.sh"
	TarRemote=""
	CmdRemote="CmdRemote.sh"
}

System_Check(){

	if [ "$1" == kill ];then
		ps -eaf |awk '$NF~/.*'${0##*/}'/&&$6~/tty|pts.*/{print $2}' |xargs -t -i kill -9 {}
		exit
	fi

	if [ ! -s $ServerList ];then
		echo "error:IP list $ServerList file does not exist or is null"
		exit
	fi

	if [ ! -s $ScriptPath ];then
		touch $ScriptPath
	fi

	for i in dialog expect
	do
		rpm -q $i >/dev/null
		[ $? -ge 1 ] && echo "$i does not exist,Please root yum -y install $i to install,exit" && exit
	done

	#System parameters
	#LazyUser=`whoami`
	LazyPath=`pwd`
	#BitNum=`getconf LONG_BIT`
	#SystemNum=`awk '/release/{print $7}' /etc/issue`

}

Select_Type() {
while true
do
clear
	case $Operate in
	1)
		Type=`dialog --no-shadow --stdout --backtitle "LazyManage" --title "System work content"  --menu "select" 10 60 0 \
		1a "[Common operations]" \
		0 "[exit]"`
	;;
	2)
		Type=`dialog --no-shadow --stdout --backtitle "LazyManage" --title "Custom work content"  --menu "select" 10 60 0 \
		1b "[web upgrade]" \
		2b "[db   manage]" \
		0 "[exit]"`
	;;
	0)
		echo -e "\e[34mLazyManage exit\e[m"
		exit
	;;
	esac
	[ $? -eq 0 ] && Select_Work $Type || break
done
}

Select_Work() {
while true
do
clear
	case $Type in
	1a)
		Work=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "Common operations" --menu "select" 20 60 0 \
		1aa "[custom cmd ]" \
		2aa "[scp file   ]" \
		3aa "[exec script]" \
		0 "[exit]"`
	;;
	1b)
		Work=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "web upgrade" --menu "select" 20 60 0 \
		1ba "[job1]" \
		2ba "[job2]" \
		3ba "[job3]" \
		0 "[exit]"`
	;;
	2b)
		Work=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "db   manage" --menu "select" 20 60 0 \
		1bb "[job1]" \
		2bb "[job2]" \
		3bb "[job3]" \
		0 "[exit]"`
	;;
	0)
		echo -e "\e[34mLazyManage exit\e[m"
		exit
	;;
	esac
	[ $? -eq 0 ] && Get_Ip $Work || break
done
}

Get_Ip(){
case $Work in
[1-9]a[a-z])
	List=`awk '$1!~"^#"&&$1!=""{print $1" "$1" on"}' $ServerList`
;;
1ba)
	List=`awk '$1!~"^#"&&$1!=""&&$2=="job1"&&$3=="web"{print $1" "$2"_"$3" on"}' $ServerList`
;;
2ba)
	List=`awk '$1!~"^#"&&$1!=""&&$2=="job2"&&$3=="web"{print $1" "$2"_"$3" on"}' $ServerList`
;;
3ba)
	List=`awk '$1!~"^#"&&$1!=""&&$2=="job3"&&$3=="web"{print $1" "$2"_"$3" on"}' $ServerList`
;;
1bb)
	List=`awk '$1!~"^#"&&$1!=""&&$2=="job1"&&$3=="db"{print $1" "$2"_"$3" on"}' $ServerList`
;;
2bb)
	List=`awk '$1!~"^#"&&$1!=""&&$2=="job2"&&$3=="db"{print $1" "$2"_"$3" on"}' $ServerList`
;;
3bb)
	List=`awk '$1!~"^#"&&$1!=""&&$2=="job3"&&$3=="db"{print $1" "$2"_"$3" on"}' $ServerList`
;;
0)
	echo -e "\e[34mLazyManage exit\e[m"
	exit
;;
*)
	echo "Dialog list does not exist"
	break
;;
esac

IpList=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "ip list" --separate-output --checklist "select IP" 0 60 0 $List |sort -u`
if [ "X$IpList" == "X" ];then
	break
fi

Message=`cat <<EOF

Please make sure the information
========================
$IpList
========================
EOF`

dialog --backtitle "LazyManage" --title "Confirm IP" --no-shadow --yesno "$Message" 20 60
[ $? -eq 0 ] && Perform || break
}

Perform(){
	case $Work in
	1aa)
		echo -e '\e[35mPlease enter the custom command[backspace=ctrl+backspace][Exit the command mode=exit]\e[m'
		while read Cmd
		do
			if [ "$Cmd" == "exit" ];then
				echo "Exit the command mode"
				break
			elif [ X"$Cmd" != X ];then
				echo "$Cmd" > "$CmdRemote"
				RemoteFile="$CmdRemote"
				ExecScript="$CmdRemote" 
				Record_Log $Work "$Cmd"
				Concurrent Interactive_Auth Ssh_Script 
				Stat_Log
				echo -e '\e[35mPlease enter the custom command\e[m'
			fi
		done
	;;
	2aa)
		if [ ! -e ${ScpPath} ];then
			echo "${ScpPath} file or directory does not exist "
			read
			break
		fi
		Record_Log $Work "${ScpPath} - ${ScpRemotePath}"
		Concurrent Interactive_Auth Scp_File 
		Stat_Log
		read
	;;
	3aa)
		RemoteFile="$ScriptRemote $TarRemote"
		ExecScript="$ScriptRemote" 
		Record_Log $Work "$ScriptRemote"
		Concurrent Interactive_Auth Ssh_Script
		Stat_Log
		read
	;;
	[1-9]ba)
		echo "custom"
		#Record_Log $Work
		#Concurrent Interactive_Auth Ssh_Script
		#Stat_Log
		read
	;;
	[1-9]bb)
		echo "custom"
		read
	;;
	*)
		echo "Dialog list does not exist"
		break
	;;
	esac
}

Concurrent(){
FifoFile="$$.fifo"
mkfifo $FifoFile
exec 6<>$FifoFile
rm $FifoFile
for ((i=0;i<=$Task;i++));do echo;done >&6

for Ip in $IpList
do
	read -u6
	((Total++))
	{
		$1 $2 |awk 'BEGIN{RS="(expect_start|expect_eof|expect_failure)"}END{print $0}' |sed '/Connection to.*closed/d' |tee -a $LogPath
		echo >&6 
	} &
done
wait
exec 6>&-
}

Interactive_Auth(){
#RemoteRootPasswd=`awk '$1=='$Ip'{print $2}' $ServerList`

/usr/bin/expect -c "
proc jiaohu {} {
	send_user expect_start
	expect {
		password {
			send ${RemotePasswd}\r;
			send_user expect_eof
			expect {
				\"does not exist\" {
					send_user expect_failure
					exit 10
				}
				password {
					send_user expect_failure
					exit 5
				}
				Password {
					send ${RemoteRootPasswd}\r;
					send_user expect_eof
					expect {
						incorrect {
							send_user expect_failure
							exit 6
						}
						eof 
					}
				}
				eof
			}
		}
		passphrase {
			send ${KeyPasswd}\r;
			send_user expect_eof
			expect {
				\"does not exist\" {
					send_user expect_failure
					exit 10
				}
				passphrase{
					send_user expect_failure
					exit 7
				}
				Password {
					send ${RemoteRootPasswd}\r;
					send_user expect_eof
					expect {
						incorrect {
							send_user expect_failure
							exit 6
						}
						eof
					}
				}
				eof
			}
		}
		Password {
			send ${RemoteRootPasswd}\r;
			send_user expect_eof
			expect {
				incorrect {
					send_user expect_failure
					exit 6
				}
				eof
			}
		}
		\"No route to host\" {
			send_user expect_failure
			exit 4
		}
		\"Invalid argument\" {
			send_user expect_failure
			exit 8
		}
		\"Connection refused\" {
			send_user expect_failure
			exit 9
		}
		\"does not exist\" {
			send_user expect_failure
			exit 10
		}
		
		\"Connection timed out\" {
			send_user expect_failure
			exit 11
		}
		timeout {
			send_user expect_failure
			exit 3
		}
		eof
	}
}
set timeout $TimeOut
switch $1 {
	Ssh_Script {
		spawn scp -P $Port -o StrictHostKeyChecking=no $RemoteFile $RemoteUser@$Ip:/tmp/
		jiaohu
		spawn ssh -t -p $Port -o StrictHostKeyChecking=no $RemoteUser@$Ip /bin/su - $RemoteRootUser -c  \\\"/bin/sh /tmp/${ExecScript}\\\" ;
		jiaohu
	}
	Scp_File {
		spawn scp -P $Port -o StrictHostKeyChecking=no -r $ScpPath $RemoteUser@$Ip:${ScpRemotePath};
		jiaohu
	}
}
"
case $? in
0)    echo -e "\e[32m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Done: ------------------------  [OK] \e[m"  ;;
1|2)  echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: expect grammar or unknown error \e[m"  ;;
3)    echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: connection timeout \e[m"  ;;
4)    echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: host not found \e[m"  ;;
5)    echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: user passwd error \e[m"  ;;
6)    echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: root passwd error \e[m"  ;;
7)    echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: key passwd error \e[m"  ;;
8)    echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: ssh parameter not correct \e[m"  ;;
9)    echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: ssh invalid port parameters \e[m"  ;;
10)   echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: root user does not exist \e[m"  ;;
11)   echo -e "\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: ssh timeout  \e[m"  ;;
esac
}

Record_Log(){
	LogDir="$LazyPath/lazylog/`date +%Y%m%d`"
	LogPath="$LogDir/lazy_`date +%H_%M_%S`.log"
	mkdir -p $LogDir
	echo -e "`date +%Y-%m-%d_%H:%M` Perform $1 : $2" >> $LogPath
	echo -e "\e[33m`date +%Y-%m-%d_%H:%M` Perform  $1 : $2 \e[m"
	Total=0
}

Stat_Log(){
	Failure=`grep -wc 'Ssh_Error:' $LogPath`
	Successful=`expr $Total - $Failure`
	echo -e "`date +%Y-%m-%d_%H:%M` All operation complete: Total[ $Total ] Successful[ $Successful ] Failure[ $Failure ]" >> $LogPath
	if [ "$Failure" == "0" ];then
		echo -e "`date +%Y-%m-%d_%H:%M` All operation complete: \e[32mTotal[ $Total ] Successful[ $Successful ] Failure[ $Failure ]\e[m"
	else
		echo -e "`date +%Y-%m-%d_%H:%M` All operation complete: \e[31mTotal[ $Total ] Successful[ $Successful ] Failure[ $Failure ]\e[m"
	fi
	sed -i -r -e 's/\r//g' -e '/Ssh_Error:|Ssh_Done:/s/^.....|....$//g' $LogPath
}

trap "" 2 3
Set_Variable
System_Check $1

#Script entrance
Operate=`dialog --no-shadow --stdout --backtitle "LazyManage" --title "manipulation menu"  --menu "select" 10 60 0 \
1 "[system operate]" \
2 "[custom operate]" \
0 "[exit]"`
[ $? -eq 0 ] && Select_Type $Operate || exit

done
#End