求分析nginx日志的shell脚本

搬瓦工机场JMS

最近总有小学生来搞事,网上找了下发现有BUG不能用,求会shell的大佬帮个忙

分析nginx最近N分钟的日志,N分钟内某IP访问M次就记录到txt里。下面这个是网上找的,时间那里不对,分析的是整个日志文件,搞了半天不会写。顺便吐槽一下shell,空格、单双引号 搞的脑壳疼

  1. #/bin/bash
  2. #日志文件,你需要改成你自己的路径
  3. logfile=/data/wwwlogs/
  4. last_minutes=1
  5. #开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)
  6. start_time= date +"%Y-%m-%d %H:%M:%S" -d ‘-1 minutes’
  7. echo $start_time
  8. #结束时间现在
  9. stop_time=`date +"%Y-%m-%d %H:%M:%S"`
  10. echo $stop_time
  11. cur_date="`date +%Y-%m-%d`"
  12. echo $cur_date
  13. #过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径
  14. tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" ‘{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}’ | awk ‘{print $1}’ | sort | uniq -c | sort -nr > $logfile/log_ip_top10
  15. ip_top=`cat $logfile/log_ip_top10 | head -1 | awk ‘{print $1}’`
  16. ip=`cat $logfile/log_ip_top10 | awk ‘{if($1>2)print $2}’`
  17. # 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.log,这里为了测试设置2,你需要改成其它的数字
  18. for line in $ip
  19. do
  20. echo $line >> $logfile/black.txt
  21. echo $line
  22. # 这里还可以执行CF的API来提交数据到CF防火墙
  23. done
  24. # 填Cloudflare Email邮箱
  25. CFEMAIL="[email protected]"
  26. # 填Cloudflare API key
  27. CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"
  28. # 填Cloudflare Zones ID 域名对应的ID
  29. ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxx"
  30. # /data/wwwlogs/black.txt存放恶意攻击的IP列表
  31. # IP一行一个。
  32. IPADDR=$(</data/wwwlogs/black.txt)
  33. # 循环提交 IPs 到 Cloudflare  防火墙黑名单
  34. # 模式(mode)有 block, challenge, whitelist, js_challenge
  35. for IPADDR in ${IPADDR[@]}; do
  36. echo $IPADDR
  37. curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules&quot; \
  38.   -H "X-Auth-Email: $CFEMAIL" \
  39.   -H "X-Auth-Key: $CFAPIKEY" \
  40.   -H "Content-Type: application/json" \
  41.   –data ‘{"mode":"block","configuration":{"target":"ip","value":"’$IPADDR’"},"notes":"CC Attatch"}’
  42. done
  43. # 删除 IPs 文件收拾干净
  44. rm -rf /data/wwwlogs/black.txt

复制代码

陕西网友:goaccess
山西网友:第6行

  1. start_time=`date +"%Y-%m-%d %H:%M:%S" -d "-$last_minutes minutes"`

复制代码

青海网友:嗯 这个是写固定了 数字1 输出的时间信息也对
但是他分析的还是整个日志文件
香港网友:关键在第14行,你要看日志的时间是在$几。
西藏网友:Cloudflare 自动脚本提交攻击(恶意)IP到防火墙[修改版],我自用脚本
https://www.yunloc.com/652.html
香港网友:来学习一下
青海网友:什么意思,是指它没按照你设定的时间分析,还是日志分析载入全文件你觉得不好?第一种情况看第14行,要看匹配规则跟你文件里面的格式是否匹配,第二种没什么问题。其它时间你只要改last_minutes就行了
天津网友:
你修改的试过吗?我试了下不行呢,日志格式是默认的。

  1. 110.xxx.xxx.205 – – [27/Aug/2019:10:56:42 +0800] "GET /bo/2929.html HTTP/1.1" 200 5588 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2311.1978 Mobile Safari/537.36; Bytespider"
  2. 1.xxx.xxx.225 – – [27/Aug/2019:10:56:43 +0800] "GET /mo.php?id=24297 HTTP/1.1" 200 31 "https://www.xxxx.com/sx/24297/&quot; "Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Mobile/15E148 Safari/604.1"
  3. 100.xxx.xxx.104 – – [27/Aug/2019:10:56:45 +0800] "GET /bo/222.html HTTP/1.1" 200 6789 "-" "MauiBot ([email protected])"

复制代码

—————————-
修改第四列可以了
tac $logfile/xxx.log | awk -v st="$start_time" -v et="$stop_time" ‘{t=substr($4,RSTART+14,21);if(t>=st && t<=et) {print $0}}’ | awk ‘{print $1}’ | sort | uniq -c | sort -nr > $logfile/log_ip_top10

还有个问题,如果每天不切割日志的话,你这个时间对比不带日期,会统计错误
宁夏网友:
日志是每日切割了,不然太大了影响查询速度,脚本经过测试没问题,自用3个多月了

关于日志格式是军哥的LNMP默认

或者你在conf 的http段添加:

  1.         map $HTTP_CF_CONNECTING_IP $clientRealIp
  2.                 {
  3.              "" $remote_addr;
  4.              ~^(?P<firstAddr>[a-z0-9.:]+),?.*$ $firstAddr;
  5.         }
  6.         log_format access ‘$clientRealIp [$time_local] "$request" ‘
  7.                           ‘$status $body_bytes_sent "$http_referer" ‘
  8.                           ‘$http_user_agent $remote_addr $request_time’;

复制代码
CloudFlare获取网站日志真实IP地址

未经允许不得转载:美国VPS_搬瓦工CN2 GIA VPS » 求分析nginx日志的shell脚本

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏