#!/bin/bash
# 统计次数和IP,并逐行读取登陆失败次数和IP
cat /var/log/secure | grep "Failed" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | grep -v '^$' | grep -v '^#' | while read TIME_OUT IP
# 循环读取
do
# 当登录次数超过3次时,将该IP地址写入黑名单
if [ $TIME_OUT -ge 3 ] ; then
# 判断超过3次的IP是否存在ssh黑名单目录文件当中,若不存在则写入
if [[ `grep -c "$IP" /etc/hosts.deny` -eq '0' ]];then
# 将不存在黑名单文件且超过3次登录失败的IP写入黑名单配置文件
echo "sshd:$IP:deny" >> /etc/hosts.deny
fi
fi
done
# 定时清理系统用登录信息文件,优化读取速度,统计系统用户登录文件行数
number=`grep -n "" /var/log/secure | tail -n1 | gawk -F: '{print $1}'`
# 当该文件行数大于等于1000行则进行清理
if [ $number -ge 1000 ]; then
# 清空文件内容
echo "" > /var/log/secure
fi
# 判断黑名单备份文件是否存在
if [ ! -d "/etc/hosts.deny.bak" ]; then
touch /etc/hosts.deny.bak
fi
# 利用MD5SUM检测文件内容是否变化
A=`md5sum /etc/hosts.deny | awk '{print $1}'`
B=`md5sum /etc/hosts.deny.bak | awk '{print $1}'`
if [ "$A" != "$B" ] ; then
# 文件不同, 获取当前最新黑名单,并发送更新邮件
list=`cat /etc/hosts.deny`
echo -e "黑名单已被更新\n$list" | mail -s "黑名单信息已更新" 1025473445@qq.com
# 通过覆盖让两份名单同步,cp命令加上反斜杠\即不用Y确认
\cp /etc/hosts.deny /etc/hosts.deny.bak
fi
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。