shell编写可视化菜单实现远程控制

虽说做了好几年运维,但心里还是把自己当个写代码滴,对几年前就火热的自动化运维没正眼瞧过。

今年维护的主机终于扩到10台了,每台部署的业务都还不完全相同,每次需要全部重启那个头疼呀,决定自己写个远程一键重启的脚本让自己省点心,写个博客记录一下,不然半年准忘!

思路大概就是选其中一台主机配ssh公钥的方式可免密码登录其他都有所有主机,在此主机上部署脚本及配置文件实现多级菜单可视化的选择,最终通过ssh去执行目标主机的一个编写好的重启脚本达到重启目标主机的应用。


#!/bin/bash
#--------------------------------------------------------------------
# Fuction:程序启停脚本
# Version: 1.0
# Created: ****
# Created date:2017/11/14
# Modify history:
#--------------------------------------------------------------------
. /****/****/.bash_profile 
source ./pubFuncXml.sh
trap '' INT

if [ ! -f $listfile ]
then
	echo "[ERROR]list.ini不存在!退出"
	exit;
fi

if [ ! -f $hostfile ]
then
	echo "[ERROR]host.xml不存在!退出"
	exit;
fi

#生成一级菜单
createMenu1(){
	declare -a numArray=();		
	echo -e "\n-----------请根据菜单提示开始重启应用-----------------"  
	echo "接口应用:"  
	i=0
	for tag in "${projArray[@]}"
	do
	  numArray[${i}]=$i
		echo " (${i}) $tag" 
		i=$(($i+1))
	done
	 
	echo " (x) Exit"  
	echo "----------------------------------"  
	

	checkInput=true
	while $checkInput; do
		read -p "请选择:" input
		if echo "${numArray[@]}" | grep -w "$input" &>/dev/null; then
			checkInput=false
		else
		  	##退出
				if [ ! -z $input ] && [ $input == 'x' ];then
				  exit 0;
				fi
				
				echo -e "输入不合法,请重新输入\n"
				
		fi
		
	done
	
  
  i=0
	for tag in "${projArray[@]}"
	do
	   if [ $input == $i ];then
	      getHostConfig ip v_ip $tag
	      
	      #将ip信息转成数组
	      declare -a ipArray=();	
	      k=0
				while read line 
				do  
					 ipArray[k++]=$line
				done <<< "$v_ip"

				createMenu2 $tag "${ipArray[*]}" 
	   fi
	   i=$(($i+1))
	done
  
}

# 生成二级菜单
# 参数1:项目  参数2:ip
createMenu2(){
	declare -a numArray=();
	hostip=$2
	project=$1
	echo -e "\n主机信息(${project}):"  

	i=0
	for tag in ${hostip[@]}
	do
	  numArray[${i}]=$i
		echo " (${i}) $tag" 
		i=$(($i+1))
	done
	
	echo " (r) Return"  
	echo " (x) Exit"  
	echo "----------------------------------"  
	
	
	
	checkInput=true
	while $checkInput; do
		read -p "请选择:" input
		if echo "${numArray[@]}" | grep -w "$input" &>/dev/null; then
			checkInput=false
		else
		  	##返回
		  	#if 括号的区别
				if [ ! -z $input ] && [ ${input} == 'r' ];then
				  createMenu1	
				 
		  	##退出
				elif  [ ! -z $input ] && [ $input == 'x' ];then
				  exit 0;
				else
				  echo -e "输入不合法,请重新输入\n"
				fi
				
				
				
		fi
		
	done
	
	
  i=0
	for tag in ${hostip[@]}
	do
	   if [ $input == $i ];then
	      getHostConfig app v_app $project $tag
				createMenu3 $project $tag $v_app "${hostip[*]}"
	   fi
	   i=$(($i+1))
	done
}



# 生成三级菜单
# 参数1:项目  参数2:ip 参数3:应用  参数4:ip数组
createMenu3(){
	declare -a numArray=();	
	applist=$3
	ip=$2
	project=$1
	hostip=$4
	apparr=(${applist//|/ })
	echo -e "\n应用信息(${project}->${ip}):"  
	
	i=0
	for tag in ${apparr[@]}
	do
	  numArray[${i}]=$i
		echo " (${i}) $tag" 
		i=$(($i+1))
	done
	
	echo " (r) Return"  
	echo " (x) Exit"  
	echo "----------------------------------"  


	checkInput=true
	while $checkInput; do
		read -p "请选择:" input
		if echo "${numArray[@]}" | grep -w "$input" &>/dev/null; then
			checkInput=false
		else
		  	##返回
				if [ ! -z $input ] && [ $input == 'r' ];then
				  createMenu2  $project "${hostip[*]}"
				 
		  	##退出
				elif  [ ! -z $input ] && [ $input == 'x' ];then
				  exit 0;
				else
				  echo -e "输入不合法,请重新输入\n"
				fi
				
				
				
		fi
		
	done

  i=0
	for tag in ${apparr[@]}
	do
	   #if [ ! -z $input ] && [ $input == $i ];then
	   if [ $input == $i ];then
				createMenu4  $project  $ip $applist "${hostip[*]}" $input
	   fi
	   i=$(($i+1))
	done
}




# 生成四级菜单
# 参数1:项目  参数2:ip 参数3:应用数组  参数4:ip数组 参数5: app数组下标
createMenu4(){
	project=$1
	ip=$2
	applist=$3
	hostip=$4
	arr_index=$5
	
  getHostConfig user v_user $project $ip
  getHostConfig cmd v_cmd $project $ip
  getHostConfig consolelog v_clog $project $ip
  getHostConfig tradelog v_tlog $project $ip
  
  cmdarr=(${v_cmd//|/ })
  rebcmd=${cmdarr[$arr_index]}

  clogarr=(${v_clog//|/ })
  clog=${clogarr[$arr_index]}

  tlogarr=(${v_tlog//|/ })
  tlog=${tlogarr[$arr_index]}

  apparr=(${applist//|/ })
  app=${apparr[$arr_index]}
             	
	echo -e "\n选择操作(${project}->${ip}->${app}):"  
  
	
	echo " (0) 重启" 
	echo " (1) 停"  
	echo " (2) 启" 
	echo " (3) 跟踪控制台日志" 
	echo " (4) 跟踪业务日志" 
	echo " (r) Return"  
	echo " (x) Exit"  
	echo "----------------------------------"  


	checkInput=true
	while $checkInput; do
		read -p "请选择:" input

    case $input in  
            0)echo "开始重启程序"
              #checkInput=false
              procReboot $ip $v_user $rebcmd reboot
            ;;
            1)echo "开始停程序"
              #checkInput=false
              procReboot $ip $v_user $rebcmd stop            
            ;;  
            2)echo "开始启程序"
              #checkInput=false
              procReboot $ip $v_user $rebcmd start       
            ;;
            3)echo "跟踪控制台日志"
              #checkInput=false
              tailRemotelog $ip $v_user $clog       
            ;;
            4)echo "跟踪业务日志"
              #checkInput=false
              tailRemotelog $ip $v_user $tlog       
            ;;                        
            r)checkInput=false
            	createMenu3 $project $ip $applist "${hostip[*]}" 
            ;;           
            x)exit 0
            ;;
						$REPLY)createMenu4 $project $ip $applist "${hostip[*]}"  $arr_index
            ;;             
            *)echo -e "输入不合法,请重新输入\n";;
    esac  
		
	done
	


}


# ssh远程执行脚本
# 参数1:ip  参数2:用户 参数3:脚本命令 参数4:操作类型
procReboot()
{
   ip=$1
   user=$2
	 cmd=$3       
	 type=$4
	 
	 remoteCmd=`echo $cmd | awk -F "[()]" '{print $1}'`
	 cmdParams=`echo $cmd | awk -F "[()]" '{print $2}'`
	 para=(${cmdParams//,/ })
	 for tag in ${para[@]}
	 do
	 	  remoteCmd+=" "$tag
	 done
	 remoteCmd+=" "$type 
	 echo "==>执行远程重启 目标主机[${ip}] 执行脚本[$remoteCmd]" 
	 sleep 1
	 ssh ${user}@${ip} "$remoteCmd;"  < /dev/null

}


# ssh远程tail日志文件
# 参数1:ip  参数2:用户 参数3:日志文件 
tailRemotelog()
{
   ip=$1
   user=$2
	 logpath=$3       

	 echo "==>执行远程重启 目标主机[${ip}] 执行脚本[tail -c 10240 $logpath]" 
	 sleep 2	 
	 
	 ssh ${user}@${ip} "tail -c 10240 $logpath;echo -e '\n'"  
##	ssh ${user}@${ip} <<EOF
##		echo $logpath
##	tail -f $logpath|while read line
##  do
##      echo $line
##      if [ $logctr ];then
##          break
##      else
##         echo $line
##      fi
##
##  done			
#EOF
 
}


#初始化host参数
initHost $hostfile
createMenu1

写过这个真觉得自己shell基础不扎实,到处查该怎么用,还遇到了几个陷阱浪费了我不少时间。

1. echo "$xmlParam" 和 echo $xmlParam的区别

2.if [ ! -z $input ] && [ $input == 'x' ] 和 if [[ ! -z $input ] && [ $input == 'x' ]]的区别



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值