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="[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