叶盖透鸭#!/bin/bash################################################################################################################################需求#1.每隔10s监控httpd的进程数若进程数大于等于500则自动重启Apache服务并检测服务是否重启成功#2.若未成功则需要再次启动若重启5次依旧没有成功则向管理员发送告警邮件并退出检测#3.如果启动成功则等待1分钟后再次检测httpd进程数若进程数正常则恢复正常检测10s一次否则放弃重启并向管理员发送告警邮件并退出检测################################################################################################################################计数器函数check_service(){j0for i in seq 1 5do#重启Apache的命令/usr/local/apache2/bin/apachectl restart 2 /var/log/httpderr.log#判断服务是否重启成功if [ $? -eq 0 ]thenbreakelsej$[$j1]fi#判断服务是否已尝试重启5次if [ $j -eq 5 ]thenmail.pyexitfidone}while :donpgrep -l httpd|wc -l#判断httpd服务进程数是否超过500if [ $n -gt 500 ]then/usr/local/apache2/bin/apachectl restartif [ $? -ne 0 ]thencheck_serviceelsesleep 60n2pgrep -l httpd|wc -l#判断重启后是否依旧超过500if [ $n2 -gt 500 ]thenmail.pyexitfififi#每隔10s检测一次sleep 10done19、批量修改服务器用户密码Linux主机SSH连接信息旧密码cat old_pass.txt192.168.18.217 root 123456 22192.168.18.218 root 123456 22内容格式IP User Password PortSSH远程修改密码脚本新密码随机生成#!/bin/bashOLD_INFOold_pass.txtNEW_INFOnew_pass.txtfor IP in $(awk /^[^#]/{print $1} $OLD_INFO); doUSER$(awk -v I$IP I$1{print $2} $OLD_INFO)PASS$(awk -v I$IP I$1{print $3} $OLD_INFO)PORT$(awk -v I$IP I$1{print $4} $OLD_INFO)NEW_PASS$(mkpasswd -l 8) # 随机密码echo $IP $USER $NEW_PASS $PORT $NEW_INFOexpect -c spawn ssh -p$PORT $USER$IPset timeout 2expect {\(yes/no)\ {send \yes\r\;exp_continue}\password:\ {send \$PASS\r\;exp_continue}\$USER*\ {send \echo \$NEW_PASS\ |passwd --stdin $USER\r exit\r\;exp_continue}}done生成新密码文件cat new_pass.txt192.168.18.217 root n8wX3mU% 22192.168.18.218 root c87;ZnnL 2220、iptables 自动屏蔽访问网站频繁的IP场景恶意访问,安全防范1屏蔽每分钟访问超过200的IP方法1 根据访问日志Nginx为例#!/bin/bashDATE$(date %d/%b/%Y:%H:%M)ABNORMAL_IP$(tail -n5000 access.log |grep $DATE |awk {a[$1]}END{for(i in a)if(a[i]100)print i})#先tail防止文件过大读取慢数字可调整每分钟最大的访问量。awk不能直接过滤日志因为包含特殊字符。for IP in $ABNORMAL_IP; doif [ $(iptables -vnL |grep -c $IP) -eq 0 ];theniptables -I INPUT -s $IP -j DROPfidone方法2 通过TCP建立的连接#!/bin/bashABNORMAL_IP$(netstat -an |awk $4~/:80$/ $6~/ESTABLISHED/{gsub(/:[0-9]/,,$5);{a[$5]}}END{for(i in a)if(a[i]100)print i})#gsub是将第五列客户端IP的冒号和端口去掉for IP in $ABNORMAL_IP; doif [ $(iptables -vnL |grep -c $IP) -eq 0 ]; theniptables -I INPUT -s $IP -j DROPfidone2屏蔽每分钟SSH尝试登录超过10次的IP方法1 通过lastb获取登录状态:#!/bin/bashDATE$(date %a %b %e %H:%M) #星期月天时分 %e单数字时显示7而%d显示07ABNORMAL_IP$(lastb |grep $DATE |awk {a[$3]}END{for(i in a)if(a[i]10)print i})for IP in $ABNORMAL_IP; doif [ $(iptables -vnL |grep -c $IP) -eq 0 ];theniptables -I INPUT -s $IP -j DROPfidone方法2通过日志获取登录状态#!/bin/bashDATE$(date %b %d %H)ABNORMAL_IP$(tail -n10000 /var/log/auth.log |grep $DATE |awk /Failed/{a[$(NF-3)]}END{for(i in a)if(a[i]5)print i})for IP in $ABNORMAL_IP; doif [ $(iptables -vnL |grep -c $IP) -eq 0 ]; theniptables -A INPUT -s $IP -j DROPecho $(date %F %T) - iptables -A INPUT -s $IP -j DROP ~/ssh-login-limit.logfidone21、根据web访问日志封禁请求量异常的IP如IP在半小时后恢复正常则解除封禁#!/bin/bash#####################################################################################根据web访问日志封禁请求量异常的IP如IP在半小时后恢复正常则解除封禁####################################################################################logfile/data/log/access.log#显示一分钟前的小时和分钟d1date -d -1 minute %H%Md2date %Mipt/sbin/iptablesips/tmp/ips.txtblock(){#将一分钟前的日志全部过滤出来并提取IP以及统计访问次数grep $d1: $logfile|awk {print $1}|sort -n|uniq -c|sort -n $ips#利用for循环将次数超过100的IP依次遍历出来并予以封禁for i in awk $1100 {print $2} $ipsdo$ipt -I INPUT -p tcp --dport 80 -s $i -j REJECTecho date %F-%T $i /tmp/badip.logdone}unblock(){#将封禁后所产生的pkts数量小于10的IP依次遍历予以解封for a in $ipt -nvL INPUT --line-numbers |grep 0.0.0.0/0|awk $210 {print $1}|sort -nrdo$ipt -D INPUT $adone$ipt -Z}#当时间在00分以及30分时执行解封函数if [ $d2 -eq 00 ] || [ $d2 -eq 30 ]then#要先解再封因为刚刚封禁时产生的pkts数量很少unblockblockelseblockfi22、判断用户输入的是否为IP地址方法1:#!/bin/bashfunction check_ip(){IP$1VALID_CHECK$(echo $IP|awk -F. $1 255$2255$3255$4255{print yes})if echo $IP|grep -E ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/dev/null; thenif [ $VALID_CHECK yes ]; thenecho $IP available.elseecho $IP not available!fielseecho Format error!fi}check_ip 192.168.1.1check_ip 256.1.1.1方法2#!/bin/bashfunction check_ip(){IP$1if [[ $IP ~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; thenFIELD1$(echo $IP|cut -d. -f1)FIELD2$(echo $IP|cut -d. -f2)FIELD3$(echo $IP|cut -d. -f3)FIELD4$(echo $IP|cut -d. -f4)if [ $FIELD1 -le 255 -a $FIELD2 -le 255 -a $FIELD3 -le 255 -a $FIELD4 -le 255 ]; thenecho $IP available.elseecho $IP not available!fielseecho Format error!fi}check_ip 192.168.1.1check_ip 256.1.1.1增加版加个死循环如果IP可用就退出不可用提示继续输入并使用awk判断。#!/bin/bashfunction check_ip(){local IP$1VALID_CHECK$(echo $IP|awk -F. $1 255$2255$3255$4255{print yes})if echo $IP|grep -E ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ /dev/null; thenif [ $VALID_CHECK yes ]; thenreturn 0elseecho $IP not available!return 1fielseecho Format error! Please input again.return 1fi}while true; doread -p Please enter IP: IPcheck_ip $IP[ $? -eq 0 ] break || continuedone总结我是南国以南i记录点滴每天成长一点点学习是永无止境的转载请附原文链接