系统巡检脚本,有常用的检查模块,如硬盘、内存、进程等。安全性检查等.

1.巡查脚本

代码如下(示例):xunjian.sh

#!/bin/bash







#系统状态
host(){
    while :
    do
        clear
        echo -e "当前在查看\e[1; 31m[主机状态信息]Ne[0m"
        echo -e "\e[1;35m选择如下:\e[0m"
        echo -e "\e[1;34m1. 登录情况检查\e[0m"
        echo -e "\e[1;34m2. 特权用户检查\e[0m"
        echo -e "\e[1;34m3. mail 日志文件大小检查\e[0m"
        echo -e "\e[1;34m4. NTP 授时服务状态检查\e[0m"
        echo -e "\e[1;34m5. NTP 同步服务状态\e[0m"
        echo -e "\e[1;34m6. 系统错误日志检查\e[0m"
        echo -e "\e[1;34m7. 系统开启的端口及协议Ne[0m"
        echo -e "\e[1;34m8. 返回主菜单\e[0m"
        read -p "请输入你的选择:" choice
        case $choice in
1)
    echo "当前用户登录状态为: "
    who | awk '{log_users[$1]++}END{for (user in log_users){printf "%s 用户登陆了 %d 个终端\n",user,log_users[user]}}'
    ;;
2)
    echo -n "特权用户(uid=0)数量为: "
    awk -F: '$3==0 {print $1}' /etc/paaawd | wc -l
    ;;
3)
    echo -n "当前单个邮件文件占用空间大于 64M 的数量为:"
    find /var/spool/mail -size +64M | wc -l
    ;;
4)
    echo -n "NTP 授时服务状态为:"
    systemctl status chronyd | sed -n 3p | awk '{print $2}'
;;
5)
    systemctl status chronyd | sed -n 3p | awk '{print $2}'
    [ "${status}" == "yes" ] && echo -e "\e[1;32mNTP 同步服务正在运行\e[0m" || echo -e "\e[1;31mNTP 同步服务当前没有运行\e[0m"
    ;;
6)
    cat /var/log/messages | egrep -i "fail|error|fatal|crittcal" &> /dev/mull
    [ $? -eq 0 ] && echo -e "\e[1;31m系统中有错误日志,请管理人员留意\e[0m" || echo -e "\e[1;32m暂时没有错误日志\e[0m"
    ;;
7)
    echo "当前主机开发的端口协议类型:"
    ss -pnult | awk '{print $1,$5}' | awk -F "[: ]" '{print "协议: "$1,"端口: "$NF}' | grep "[0-9]" | uniq
    ;;
8)
    break
    ;;
*)
    echo -e "\e[1;33m没有该选项,请重新选择\e[0m"
esac
echo
read -p "按 <ENTER> 键继续..."
done
clear
}


#网络相关
network(){
    while :
    do
        clear
        echo -e "当前在查看\e[1;31m[网络状态信息]\e[0m"
        echo -e "\e[1;35选择如下:\e[0m"
        echo -e "\e[1;34m1. 网络传输检查\e[0m"
        echo -e "\e[1;34m2. 网络连接的数量及状态\e[0m"
        echo -e "\e[1;34m3. 主机解析检查\e[0m"
        echo -e "\e[1;34m4. 路由状态检查\e[0m"
        echo -e "\e[1;34m5. 返回主菜单\e[0m"
        read -p "请输入你的选择:" choice
        case $choice in
    1)
        RX_DRP_num=`netstat -in | grep -Ei "eth" | awk '{print$5}' | awk 'BEGIN{size=0}{size=$1}END{print size}'`
        TX_DRP_num=`netstat -in | grep -Ei "eth" | awk '{print$9}' | awk 'BEGIN{size=0}{size=$1}END{print size}'`
        if [ ${RX_DRP_num} -ne 0 -a ${TX_DRP_num} -ne 0 ];then
            echo -e "\e[1;31m网络传输过程中存在过问题\e[0m"
        else
            echo -e "\e[1;32m网络传输状态暂时良好\e[0m"
        fi
        ;;
    2)
        netstat -ant | grep "^tcp" | awk '{print $6}' | sont | uniq -c
        ;;
    3)
        grep "127.0.0.1" /etc/hosts &> /dev/mull
        if grep "127.0.0.1" /etc/hosts &> /dev/mull;then
            echo -e "\e[1;32m主机解析正常\e[0m"
        else
            echo -e "\e[1;31m主机解析不正常\e[0m"
        fi
        ;;
    4)
        router=`netstat -nr | grep "UG" | awk '{print $2}'`
        if ping -c2 -W2 $router &> /dev/mull;then
            echo -e "\e[1;31m默认路由运行状态暂时良好\e[0m"
            else
            echo -e "\e[1;31m默认路由故障,请及时检查处理\e[0m"
        fi
        ;;
    5)
        break
        ;;
    *)    
            echo -e "\e[1;33m没有该选项,请重新选择\e[0m"
            esac
            echo
            read -p "按 <ENTER> 键继续..."
        done
        clear
}


#进程相关
process(){
    while :
    do
        clear
        echo -e "当前在查看\e[1;31m[进程状态信息]\e[0m"
        echo -e "\e[1;35m选择如下:\e[0m"
        echo -e "\e[1;34m1. 僵尸进程检查\e[0m"
        echo -e "\e[1;34m2. 父进程为 1 的非 root 用户检查\e[0m"
        echo -e "\e[1;34m3. 返回主菜单\e[0m"
        read -p "请输入你的选择:" choice
        case $choice in
    1)
        ps -ef | grep -v "grep" | grep defunc
        [ $? == 0 ] && echo -e "\e[1;31m当前有僵尸进程\e[0m" || echo -e "\e[1;32m当前没有僵尸进程\e[0m"
        ;;
    2)
        echo "父进程为 1 的非 root 用户进程:"
        ps -ef | awk '$3 == 1 && $1 != "root"{print}'
        ;;
    3)
        break
        ;;
    *)
        echo -e "\e[1;33m没有该选项,请重新选择\e[0m"
    esac
    echo
    read -p "按 <ENTER> 键继续..."
    done
    clear
}


#内存相关
memory(){
    while :
    do
        clear
        echo -e "当前在查看\e[1;31m[内存状态信息]\e[0m"
        echo -e "\e[1;35m选择如下:\e[0m"
        echo -e "\e[1;34m1. 交换空间使用率检查\e[0m"
        echo -e "\e[1;34m2. 操作系统内存利用率检查\e[0m"
        echo -e "\e[1;34m3. 最耗内存的进程检查\e[0m"
        echo -e "\e[1;34m4. CPU 利用率检查\e[0m"
        echo -e "\e[1;34m5. 最耗 CPU 进程检查\e[0m"
        ec ho -e "\e[1;34m6. 返回主菜单\e[0m"
        read -p "请输入你的选择:" choice
        case $choice in
    1)
        free | grep Swap | awk '{if ($3/$2 < 0.3){print "交换空间使用量暂时没有超过 30%,状态良好"}else{print "警告,交换空间已使用超过 30%"}}';;
    2)
        free | grep "Mem" | awk '{if ($3/$2 < 0.7){print "系统内存使用情况暂时没有超过 70%,状态良好"}else{print "系统内存使用已超过 70%,请留意"}}';;
    3)
        ps auxww | sed '1d' | awk '{if($4 > 20){print $0; flag="bad"}}END{if (fiag!="bad"){print "暂时没有占用内存过多的进程"}}';;
    4)
        echo "正在查询 CPU 空闲状态时间比例,请稍后..."
        yum -y install sysstat &> /dev/mull
        sar 2 2 | grep -ivE "cpu" | awk '{if ($9>30) print $9}' | sed '/^$/d'
        ;;
    5)
        ps auxww | sed 'ld' | awk '{if ($3>30){print $0; flag="bad"}}END{if(fiag!="bad"){print "暂时没有耗用 CPU 资源过多的进程"}}';;
    6)
        break;;
    *)
        echo -e "\e[1;33m没有该选项,请重新选择\e[0m"
    esac
    echo
    read -p "按 <ENTER> 键继续..."
    done
    clear
}

#磁盘管理
disk(){
    while :
    do
        clear
        echo -e "当前在查看\e[1;31m[磁盘状态信息]\e[0m"
        echo -e "\e[1;35m选择如下:\e[0m"
        ech   o -e "\e[1;34m1. 文件系统使用率\e[0m"
        echo -e "\e[1;34m2. 文件系统 inode 节点使用率\e[0m"
        echo -e "\e[1;34m3. 文件系统挂载检查\e[0m"
        echo -e "\e[1;34m4. lv 状态检查\e[0m"
        echo -e "\e[1;34m5. pv 状态检查\e[0m"
        echo -e "\e[1;34m6. 返回主菜单\e[0m"
        read -p "请输入你的选择:" choice
        case $choice in
    1)
        devs=`df | grep -v "/dev/sr0" | tr -s " "% | awk -F% ' NR!=1 && $5 > 70 {print $6}'`
        if [ -z "${devs}" ];then
            echo -e "\e[1;32m当前没有磁盘空间大于 70% 的设备\e[0m"
        else
            echo "磁盘空间使用率大于 70% 的有:"
            echo "${devs}" | tr ' ' '\n'
        fi
        ;;
    2)
        df -i | tr -s " " % | awk -F% '{if(NR!=1 && $5 > 70){print "%s inode 节点使用率大于 70%\n",$1;fiag="bad"}} END{if(fiag!="bad"){print "暂时没有 inode 使用量超过 70% 的文件系统,状态良好"}}'
        ;;
    3)
        dev_in_fstab=`egrep '^[^#\s]' /etc/fstab | awk '$2 !="swap" {print $2}'`
        dev_in_df=`df | awk '{print $6}'`
        for dev_in_fstab in $dev_in_fstab;do
            if !(echo $dev_in_df | grep $dev_in_fstab &> /dev/null);then
                echo -e "\e[1;31m警告! \e[1;33m$dev_fstab\e[0m 没有挂载\e[0m"
                flag="bsd"
            fi
        done
        [[ $flag != "bad" ]] && echo "/etc/fstab 中的所有储存设备均匀挂载到系统"
        ;;
    4)
        lvdisplay 2> /dev/mull    | grep "Lv Status"
        ;;
    5)
        pvdisplay 2> /dev/mull | grep "Allocatable"
        ;;
    6)
        break
        ;;
    *)
        echo -e "\e[1;33m没有该选项,请重新选择\e[0m"
    esac
    echo
    read -p "按 <ENTER> 键继续..."
    done
    clear
}


# 提示菜单,程序开始
menu(){
    clear
    while :
    do
        echo -e "当前在\e[1;31m[菜单]\e[0m"
        echo -e "       \e[1;36mSYSTEM CHECK\e[0m"
        echo -e "\e[1;36m1. Host\e[0m"
        echo -e "\e[1;36m2. network\e[0m"
        echo -e "\e[1;36m3. process\e[0m"
        echo -e "\e[1;36m4. memory\e[0m"
        echo -e "\e[1;36m5. Disk\e[0m"
        echo -e "\e[1;36m6. Exit\e[0m"
        read -p "请输入要进行检查的项目前的序号:" choice
        case $choice in
            1)
                host
                ;;
            2)
                netstat
                ;;
            3)
                process
                ;;
            4)
                memory
                ;;
            5)
                disk
                ;;
            6)
                break
                ;;
            *)
                echo -e "\e[1;33m没有该选项,请重新选择\e[0m"
            esac
        done
        echo "BYE"
    }

    # 调用 menu,开始整个程序
    menu