系统巡检脚本,有常用的检查模块,如硬盘、内存、进程等。安全性检查等.
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