美文网首页
Scout(Linux服务器监控系统scout.sh)

Scout(Linux服务器监控系统scout.sh)

作者: 武汉周杰 | 来源:发表于2020-02-22 20:15 被阅读0次
#!/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

相关文章

网友评论

      本文标题:Scout(Linux服务器监控系统scout.sh)

      本文链接:https://www.haomeiwen.com/subject/shdrqhtx.html