Linux服务器监控系统scout.sh

#!/bin/bash
##########################################
##                                      ##
##       服务器监控系统(程序部分)       ##
##                                      ##
##             版本号:1.0.0             ##
##                                      ##
##              程序:周杰               ##
##                                      ##
##  版权所有:武汉卓杰教育网络科技有限公司  ##
##                                      ##
##            日期:2002年3月            ##
##                                      ##
##########################################
##################
## 定义环境变量 ##
##################
####################定义颜色类型####################
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
# 标准颜色类型
N_BLK_C=""
N_RED_C=""
N_GRN_C=""
N_YLW_C=""
N_BLU_C=""
N_MGA_C=""
N_CYN_C=""
N_WHT_C=""
# 加粗颜色类型
B_BLK_C=""
B_RED_C=""
B_GRN_C=""
B_YLW_C=""
B_BLU_C=""
B_MGA_C=""
B_CYN_C=""
B_WHT_C=""
# 恢复颜色类型
CLS_C=""
####################定义颜色类型####################
####################定义各种长度值####################
#定义最大长度值
MAX_LEN=80
#定义信息框最大长度值
I_MAX_LEN=60
#定义标题框最大长度值
T_MAX_LEN=40
#定义信息框两侧的长度值
I_SIDES_LEN=2
#定义标题框两侧的长度值
T_SIDES_LEN=2
#定义信息框中两侧符号和信息之间空格的长度值
BLANK_LEN=1
####################定义各种长度值####################
####################定义路径、端口、进程变量####################
WORK_PATH="/usr/local/sbin/scout"
SCOUT_FUN=$WORK_PATH"/scout_functions"
NETWORK_PATH="/etc/sysconfig/network"
IFCFG_ETH_PATH="/etc/sysconfig/network-scripts/ifcfg-eth"
STOP_SIGN_PATH=$WORK_PATH"/stop_scout"
#PORT_A="21 22 23 25 37 39 42 43 53 79 80"
#PORT_B="107 109 110 111 113 115 117 119 123 137 138 139 143"
#PORT_C="512 513 514 515 517 518 520 525 540"
PORT_A="21 22 23 37 53 80"
PORT_B="111 113 139 401 892 895 967"
PAGE_PORT_NUM=6
ALL_PORT=$PORT_A" "$PORT_B
#COURSE_A="anacron apmd atd crond gpm httpd identd inetd ipchains kdcrotate keytable kudzu linuxconf"
#COURSE_B="lpd mysqld netfs network nfs nfslock pcmcia portmap postgresql random rstatd rusersd rwalld"
#COURSE_C="rwhod sendmail smbd snmpd sshd sybase syslogd xfs ypbind yppasswdd ypserv"
#COURSE_D="upsd"
COURSE_A="apmd crond httpd identd inetd ipchains kudzu linuxconf"
COURSE_B="lpd mysqld network pcmcia portmap postgresql"
COURSE_C="sendmail smbd sshd sybase syslogd upsd"
ALL_COURSE=$COURSE_A" "$COURSE_B" "$COURSE_C
PAGE_COURSE_NUM=6
####################定义路径、端口、进程变量####################
####################定义符号和颜色方案数及网卡数最大值####################
BLUE_PRINT_NUM=3
BLUE_PRINT_NUM_MAX=4
NET_CARD_NUM_MAX=3
####################定义符号和颜色方案数及网卡数最大值####################
##################
## 程序代码正文 ##
##################
####################终端为pts/?或ttyp?(cce)时才执行####################
tmp_str="";tty_str=""
tmp_str=`ps -t|awk '{print $2}'`
unset tmp_array
declare -a tmp_array=(`echo $tmp_str`)
tty_str=${tmp_array[1]}
if [ "${tty_str%%y*}" = "tt" ]
then
	if [ "${tty_str%%p*}" != "tty" ]
	then
		exit 0
	fi
fi
unset tmp_array; unset tmp_str
####################终端为pts/?或ttyp?(cce)时才执行####################
####################当停止标志文件不存在时,循环运行####################
####################设置标志文件或用Ctrl+C来终止运行####################
while [ ! -f $STOP_SIGN_PATH ]
do
	####################检查自定义函数库是否存在####################
	if [ ! -f $SCOUT_FUN ]
	then
		clear
		echo "未发现自定义函数库文件!"
		echo ""
		echo "路径:$SCOUT_FUN!"
		echo ""
		echo "该脚本程序停止运行并退出!"
		echo ""
		exit 1
	fi
	####################检查自定义函数库是否存在####################
	####################调用自定义变量和函数####################
	. $SCOUT_FUN
	####################调用自定义变量和函数####################
	####################循环给定不同的颜色和符号####################
	if [ $BLUE_PRINT_NUM -eq $BLUE_PRINT_NUM_MAX ]
	then
		 BLUE_PRINT_NUM=0
	fi
	BLUE_PRINT_NUM=`expr $BLUE_PRINT_NUM + 1`
	if [ $BLUE_PRINT_NUM -eq 1 ]
	then
		#给定标题框的符号(title_symbol)
		T_SYM="#"
		#给定信息框的符号(info_symbol)
		I_SYM="#"
		#给定信息框中点号的符号(info_dot_symbol)
		I_D_SYM="."
		#给定标题框符号的颜色(title_symbol_color)
		T_SYM_C=$N_GRN_C
		#给定标题框中间字符的颜色(title_middle_font_color)
		T_M_FONT_C=$B_BLU_C
		#给定信息框符号的颜色(info_symbol_color)
		I_SYM_C=$N_GRN_C
		#给定信息框中点号的颜色(info_dot_symbol_color)
		I_D_SYM_C=$N_WHT_C
		#给定信息框前面字符的颜色(info_front_font_color)
		I_F_FONT_C=$B_BLU_C
		#给定信息框后面字符的颜色(info_back_font_color)
		I_B_FONT_C=$B_BLU_C
	fi
	if [ $BLUE_PRINT_NUM -eq 2 ]
	then
		#给定标题框的符号(title_symbol)
		T_SYM="#"
		#给定信息框的符号(info_symbol)
		I_SYM="#"
		#给定信息框中点号的符号(info_dot_symbol)
		I_D_SYM="."
		#给定标题框符号的颜色(title_symbol_color)
		T_SYM_C=$N_BLU_C
		#给定标题框中间字符的颜色(title_middle_font_color)
		T_M_FONT_C=$B_GRN_C
		#给定信息框符号的颜色(info_symbol_color)
		I_SYM_C=$N_BLU_C
		#给定信息框中点号的颜色(info_dot_symbol_color)
		I_D_SYM_C=$N_WHT_C
		#给定信息框前面字符的颜色(info_front_font_color)
		I_F_FONT_C=$B_GRN_C
		#给定信息框后面字符的颜色(info_back_font_color)
		I_B_FONT_C=$B_GRN_C
	fi
	if [ $BLUE_PRINT_NUM -eq 3 ]
	then
		#给定标题框的符号(title_symbol)
		T_SYM="#"
		#给定信息框的符号(info_symbol)
		I_SYM="#"
		#给定信息框中点号的符号(info_dot_symbol)
		I_D_SYM="."
		#给定标题框符号的颜色(title_symbol_color)
		T_SYM_C=$N_GRN_C
		#给定标题框中间字符的颜色(title_middle_font_color)
		T_M_FONT_C=$B_WHT_C
		#给定信息框符号的颜色(info_symbol_color)
		I_SYM_C=$N_GRN_C
		#给定信息框中点号的颜色(info_dot_symbol_color)
		I_D_SYM_C=$N_WHT_C
		#给定信息框前面字符的颜色(info_front_font_color)
		I_F_FONT_C=$B_WHT_C
		#给定信息框后面字符的颜色(info_back_font_color)
		I_B_FONT_C=$B_WHT_C
	fi
	if [ $BLUE_PRINT_NUM -eq 4 ]
	then
		#给定标题框的符号(title_symbol)
		T_SYM="#"
		#给定信息框的符号(info_symbol)
		I_SYM="#"
		#给定信息框中点号的符号(info_dot_symbol)
		I_D_SYM="."
		#给定标题框符号的颜色(title_symbol_color)
		T_SYM_C=$N_BLU_C
		#给定标题框中间字符的颜色(title_middle_font_color)
		T_M_FONT_C=$B_WHT_C
		#给定信息框符号的颜色(info_symbol_color)
		I_SYM_C=$N_BLU_C
		#给定信息框中点号的颜色(info_dot_symbol_color)
		I_D_SYM_C=$N_WHT_C
		#给定信息框前面字符的颜色(info_front_font_color)
		I_F_FONT_C=$B_WHT_C
		#给定信息框后面字符的颜色(info_back_font_color)
		I_B_FONT_C=$B_WHT_C
	fi
	####################循环给定不同的颜色和符号####################
	####################提取服务器的名称简写的大写####################
	S_NAME=${HOSTNAME%%.*}
	S_NAME=`echo $S_NAME|tr '[a-z]' '[A-Z]'`
	####################提取服务器的名称简写的大写####################
	####################第一版(版本信息)####################
	clear
	####################显示程序版本标题框####################
	m_array[0]="服务器$S_NAME监控系统"
	m_array[1]="版本号:1.0.0"
	m_array[2]="程序:周杰"
	m_array[3]="版权所有:武汉卓杰教育网络科技有限公司"
	m_array[4]="日期:2002年3月"
	c_f_f_title $T_MAX_LEN $T_SIDES_LEN "$T_SYM" "$T_SYM_C" "`echo ${m_array[*]}`" "$T_M_FONT_C"
	unset m_array
	####################显示程序版本标题框####################
	echo ""; echo ""
	####################显示程序说明标题框####################
	f_array[0]="该系统用于监控服务器$S_NAME的运行状况"; b_array[0]=""
	f_array[1]=""; b_array[1]=""
	f_array[2]="该系统每五分钟检查一次服务器$S_NAME状况"; b_array[2]=""
	f_array[3]=""; b_array[3]=""
	f_array[4]="正在检查,请稍等"; b_array[4]=""
	c_s_info $I_MAX_LEN $I_SIDES_LEN "$I_SYM" "$I_SYM_C" "$I_D_SYM" "$I_D_SYM_C" "`echo ${f_array[*]}`" "$I_F_FONT_C" "`echo ${b_array[*]}`" "$I_B_FONT_C"
	unset f_array; unset b_array
	sleep 3
	####################第一版(版本信息)####################
	####################第二版(软硬件信息)####################
	clear
	####################显示"软硬件"标题框####################
	m_array[0]="服务器$S_NAME软硬件信息"
	c_f_f_title $T_MAX_LEN $T_SIDES_LEN "$T_SYM" "$T_SYM_C" "`echo ${m_array[*]}`" "$T_M_FONT_C"
	unset m_array
	####################显示"软硬件"标题框####################
	echo ""; echo ""
	####################显示"软硬件"信息框####################
	f_array[0]="服务器$S_NAME硬件类型"; b_array[0]="${HOSTTYPE}"
	f_array[1]="服务器$S_NAME操作系统类型"; b_array[1]="`uname -s`"
	f_array[2]="服务器$S_NAME操作系统发行版信息"; b_array[2]="`uname -r`"
	f_array[3]="服务器$S_NAME操作系统发行版语言"; b_array[3]="${LANG}"
	f_array[4]="当前日期"; b_array[4]="`date +%Y`年`date +%m`月`date +%d`日"
	f_array[5]="当前时间"; b_array[5]="`date +%k`点`date +%M`分`date +%S`秒"
	c_s_info $I_MAX_LEN $I_SIDES_LEN "$I_SYM" "$I_SYM_C" "$I_D_SYM" "$I_D_SYM_C" "`echo ${f_array[*]}`" "$I_F_FONT_C" "`echo ${b_array[*]}`" "$I_B_FONT_C"
	unset f_array; unset b_array
	####################显示"软硬件"信息框####################
	sleep 3
	####################第二版(软硬件信息)####################
	####################第三版(网络信息)####################
	clear
	####################显示"网络"标题框####################
	m_array[0]="服务器$S_NAME网络信息"
	c_f_f_title $T_MAX_LEN $T_SIDES_LEN "$T_SYM" "$T_SYM_C" "`echo ${m_array[*]}`" "$T_M_FONT_C"
	unset m_array
	####################显示"网络"标题框####################
	echo ""; echo ""
	####################显示"网络"信息框####################
	if [ -f $NETWORK_PATH ]
	then
		f_array[0]="发现网络文件$NETWORK_PATH"; b_array[0]="正常"
		tmp_name=""
		tmp_value=""
		tmp_num=1
		old_ifs="$IFS"
		IFS="="
		while read tmp_name tmp_value
		do
			f_array[$tmp_num]="$tmp_name"; b_array[$tmp_num]="$tmp_value"
			tmp_num=`expr $tmp_num + 1`
		done < $NETWORK_PATH
		IFS=$old_ifs
		c_s_info $I_MAX_LEN $I_SIDES_LEN "$I_SYM" "$I_SYM_C" "$I_D_SYM" "$I_D_SYM_C" "`echo ${f_array[*]}`" "$I_F_FONT_C" "`echo ${b_array[*]}`" "$I_B_FONT_C"
		unset f_array; unset b_array
	else
		f_array[0]="网络文件$NETWORK_PATH"; b_array[0]="未发现"
		c_s_info $I_MAX_LEN $I_SIDES_LEN "$I_SYM" "$I_SYM_C" "$I_D_SYM" "$I_D_SYM_C" "`echo ${f_array[*]}`" "$I_F_FONT_C" "`echo ${b_array[*]}`" "$I_B_FONT_C"
		unset f_array; unset b_array
	fi
	####################显示"网络"信息框####################
	sleep 3
	####################第三版(网络信息)####################
	####################第四版(网卡信息)####################
	####################显示最多六块"网卡"的标题框和信息栏####################
	net_card_num=0
	while [ $net_card_num -lt $NET_CARD_NUM_MAX ]
	do
		clear
		if [ -f "$IFCFG_ETH_PATH""$net_card_num" ]
		then
			####################显示"第几块网卡"标题框####################
			m_array[0]="服务器$S_NAME第"`expr $net_card_num + 1`"块网卡信息"
			c_f_f_title $T_MAX_LEN $T_SIDES_LEN "$T_SYM" "$T_SYM_C" "`echo ${m_array[*]}`" "$T_M_FONT_C"
			unset m_array
			####################显示"第几块网卡"标题框####################
			echo ""; echo ""
			####################显示"第几块网卡"信息框####################
			f_array[0]="网络文件$IFCFG_ETH_PATH$net_card_num"; b_array[0]="发现"
			tmp_num=1
			tmp_name=""
			tmp_value=""
			old_ifs="$IFS"
			IFS="="
			while read tmp_name tmp_value
			do
				f_array[$tmp_num]="$tmp_name"; b_array[$tmp_num]="$tmp_value"
				tmp_num=`expr $tmp_num + 1`
			done < "$IFCFG_ETH_PATH""$net_card_num"
			IFS=$old_ifs
			c_s_info $I_MAX_LEN $I_SIDES_LEN "$I_SYM" "$I_SYM_C" "$I_D_SYM" "$I_D_SYM_C" "`echo ${f_array[*]}`" "$I_F_FONT_C" "`echo ${b_array[*]}`" "$I_B_FONT_C"
			unset f_array; unset b_array
			####################显示"第几块网卡"信息框####################
		fi
		net_card_num=`expr $net_card_num + 1`
		sleep 3
	done
	unset net_card_num
	####################显示最多六块"网卡"的标题框和信息栏####################
	####################第四版(网卡信息)####################
	####################第五版(端口信息)####################
	declare -a str_array=(`echo $ALL_PORT`)
	str_num=0; tmp_num=0; port_num=0
	while [ $str_num -lt ${#str_array[*]} ]
	do
		tmp_array[$tmp_num]=${str_array[$str_num]}
		if [ $tmp_num -eq $PAGE_PORT_NUM ]
		then
			port_array[$port_num]="`echo ${tmp_array[*]}`"
			unset tmp_array
			port_num=`expr $port_num + 1`
			tmp_num=0
		else
			tmp_num=`expr $tmp_num + 1`
		fi
		str_num=`expr $str_num + 1`
	done
	port_array[$port_num]="`echo ${tmp_array[*]}`"
	unset str_array; unset tmp_array
	str_num=0; tmp_num=0; port_num=0
	while [ $port_num -lt ${#port_array[*]} ]
	do
		clear
		####################显示"扫描端口"标题框####################
		m_array[0]="服务器$S_NAME端口扫描(第`expr $port_num + 1`页)"
		c_f_f_title $T_MAX_LEN $T_SIDES_LEN "$T_SYM" "$T_SYM_C" "`echo ${m_array[*]}`" "$T_M_FONT_C"
		unset m_array
		####################显示"扫描端口"标题框####################
		echo ""; echo ""
		####################显示"扫描端口"信息框####################
		tmp_str=""
		tmp_str=`/bin/netstat -tln|awk '{print $4}'`
		declare -a f_array=(`echo ${tmp_str#*Local}`)
		str_num=0
		while [ $str_num -lt ${#f_array[*]} ]
		do
			tmp_str=""
			tmp_str="${f_array[$str_num]}"
			f_array[$str_num]="${tmp_str#0.0.0.0:}"
			str_num=`expr $str_num + 1`
		done
		tmp_str=""
		tmp_str=`/bin/netstat -tl|awk '{print $4}'`
		declare -a b_array=(`echo ${tmp_str#*Local}`)
		str_num=0
		while [ $str_num -lt ${#f_array[*]} ]
		do
			tmp_str=""
			tmp_str="${b_array[$str_num]}"
			b_array[$str_num]="${tmp_str#*:}"
			str_num=`expr $str_num + 1`
		done
		declare -a tmp_array=(`echo ${port_array[$port_num]}`)
		str_num=0
		unset f_tmp_array; unset b_tmp_array
		while [ $str_num -lt ${#tmp_array[*]} ]
		do
			tmp_str=${tmp_array[$str_num]}
			f_num=0; b_num=0;b_str=""
			while [ $f_num -lt ${#f_array[*]} ]
			do
				if [ "${f_array[$f_num]}" = "$tmp_str" ]
				then
					b_num=1
					b_str=${b_array[$f_num]}
					break
				fi
				f_num=`expr $f_num + 1`
			done
			f_tmp_array[$str_num]="扫描"${tmp_array[$str_num]}"端口"
			if [ $b_num -eq 1 ]
			then
				b_tmp_array[$str_num]=$b_str"打开"
			else
				b_tmp_array[$str_num]="未打开"
			fi
			str_num=`expr $str_num + 1`
		done
		c_s_info $I_MAX_LEN $I_SIDES_LEN "$I_SYM" "$I_SYM_C" "$I_D_SYM" "$I_D_SYM_C" "`echo ${f_tmp_array[*]}`" "$I_F_FONT_C" "`echo ${b_tmp_array[*]}`" "$I_B_FONT_C"
		unset tmp_array; unset f_array; unset b_array; unset f_tmp_array; unset b_tmp_array
		####################显示"扫描端口"信息框####################
		sleep 3
		port_num=`expr $port_num + 1`
	done
	unset port_num
	unset port_array
	####################第五版(端口信息)####################
	####################第六版(服务信息)####################
	declare -a str_array=(`echo $ALL_COURSE`)
	str_num=0; tmp_num=0; sourse_num=0
	while [ $str_num -lt ${#str_array[*]} ]
	do
		tmp_array[$tmp_num]=${str_array[$str_num]}
		if [ $tmp_num -eq $PAGE_COURSE_NUM ]
		then
			sourse_array[$sourse_num]="`echo ${tmp_array[*]}`"
			unset tmp_array
			sourse_num=`expr $sourse_num + 1`
			tmp_num=0
		else
			tmp_num=`expr $tmp_num + 1`
		fi
		str_num=`expr $str_num + 1`
	done
	sourse_array[$sourse_num]="`echo ${tmp_array[*]}`"
	unset tmp_array
	sourse_num=0
	while [ $sourse_num -lt ${#sourse_array[*]} ]
	do
		clear
		####################显示"监视网络服务"标题框####################
		m_array[0]="服务器$S_NAME网络进程检测(第`expr $sourse_num + 1`页)"
		c_f_f_title $T_MAX_LEN $T_SIDES_LEN "$T_SYM" "$T_SYM_C" "`echo ${m_array[*]}`" "$T_M_FONT_C"
		unset m_array
		####################显示"监视网络服务"标题框####################
		echo ""; echo ""
		####################显示"监视网络服务"信息框####################
		tmp_str=""
		tmp_str=`/bin/ps -e|awk '{print $4}'`
		declare -a f_array=(`echo ${tmp_str#CMD}`)
		declare -a tmp_array=(`echo ${sourse_array[$sourse_num]}`)
		str_num=0
		while [ $str_num -lt ${#tmp_array[*]} ]
		do
			tmp_str=${tmp_array[$str_num]}
			f_num=0; b_num=0;b_str=""
			while [ $f_num -lt ${#f_array[*]} ]
			do
				if [ "${f_array[$f_num]}" = "$tmp_str" ]
				then
					b_num=1
					b_str=${b_array[$f_num]}
					break
				fi
				f_num=`expr $f_num + 1`
			done
			f_tmp_array[$str_num]="查找"${tmp_array[$str_num]}"进程"
			if [ $b_num -eq 1 ]
			then
				b_tmp_array[$str_num]="发现"
			else
				b_tmp_array[$str_num]="未发现"
			fi
			str_num=`expr $str_num + 1`
		done
		c_s_info $I_MAX_LEN $I_SIDES_LEN "$I_SYM" "$I_SYM_C" "$I_D_SYM" "$I_D_SYM_C" "`echo ${f_tmp_array[*]}`" "$I_F_FONT_C" "`echo ${b_tmp_array[*]}`" "$I_B_FONT_C"
		unset tmp_array; unset f_array; unset b_array; unset f_tmp_array; unset b_tmp_array
		####################显示"监视网络服务"信息框####################
		sleep 3
		sourse_num=`expr $sourse_num + 1`
	done
	unset sourse_num
	unset sourse_array
	####################第六版(服务信息)####################
done
exit 0