全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1384|回复: 9

[Windows VPS] 求分析nginx日志的shell脚本

[复制链接]
发表于 2019-8-27 21:25:52 | 显示全部楼层 |阅读模式
最近总有小学生来搞事,网上找了下发现有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="freehao123@gmail.com"
  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" \
  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
复制代码
发表于 2019-8-27 22:15:38 | 显示全部楼层
第6行
  1. start_time=`date +"%Y-%m-%d %H:%M:%S" -d "-$last_minutes minutes"`
复制代码
 楼主| 发表于 2019-8-27 22:23:32 | 显示全部楼层

嗯 这个是写固定了 数字1 输出的时间信息也对
但是他分析的还是整个日志文件
发表于 2019-8-27 22:26:47 | 显示全部楼层
关键在第14行,你要看日志的时间是在$几。
发表于 2019-8-27 22:28:25 | 显示全部楼层
Cloudflare 自动脚本提交攻击(恶意)IP到防火墙[修改版],我自用脚本
https://www.yunloc.com/652.html
发表于 2019-8-27 22:36:26 来自手机 | 显示全部楼层
来学习一下
发表于 2019-8-27 22:57:32 | 显示全部楼层
qccj001 发表于 2019-8-27 22:23
嗯 这个是写固定了 数字1 输出的时间信息也对
但是他分析的还是整个日志文件 ...

什么意思,是指它没按照你设定的时间分析,还是日志分析载入全文件你觉得不好?第一种情况看第14行,要看匹配规则跟你文件里面的格式是否匹配,第二种没什么问题。其它时间你只要改last_minutes就行了
 楼主| 发表于 2019-8-28 08:37:12 | 显示全部楼层
本帖最后由 qccj001 于 2019-8-28 08:45 编辑
lonefly 发表于 2019-8-27 22:28
Cloudflare 自动脚本提交攻击(恶意)IP到防火墙[修改版],我自用脚本
https://www.yunloc.com/652.htm ...


你修改的试过吗?我试了下不行呢,日志格式是默认的。
  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/" "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 (crawler.feedback+dc@gmail.com)"
复制代码





----------------------------
修改第四列可以了
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

还有个问题,如果每天不切割日志的话,你这个时间对比不带日期,会统计错误
发表于 2019-8-28 09:59:27 | 显示全部楼层
本帖最后由 lonefly 于 2019-8-28 10:08 编辑
qccj001 发表于 2019-8-28 08:37
你修改的试过吗?我试了下不行呢,日志格式是默认的。


日志是每日切割了,不然太大了影响查询速度,脚本经过测试没问题,自用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地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-4 02:15 , Processed in 0.066160 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表