#!/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="�[00;30m"
N_RED_C="�[00;31m"
N_GRN_C="�[00;32m"
N_YLW_C="�[00;33m"
N_BLU_C="�[00;34m"
N_MGA_C="�[00;35m"
N_CYN_C="�[00;36m"
N_WHT_C="�[00;37m"
# 加粗颜色类型
B_BLK_C="�[01;30m"
B_RED_C="�[01;31m"
B_GRN_C="�[01;32m"
B_YLW_C="�[01;33m"
B_BLU_C="�[01;34m"
B_MGA_C="�[01;35m"
B_CYN_C="�[01;36m"
B_WHT_C="�[01;37m"
# 恢复颜色类型
CLS_C="�[m"
####################定义颜色类型####################
####################定义各种长度值####################
#定义最大长度值
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
网友评论