设为首页收藏本站

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 59|回复: 9

求分析nginx日志的shell脚本

[复制链接]

20

主题

198

回帖

504

积分

高级会员

积分
504
发表于 2019-8-27 21:25:52 | 显示全部楼层 |阅读模式
最近总有小学生来搞事,网上找了下发现有BUG不能用,求会shell的大佬帮个忙

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


[ol]
  • #/bin/bash
  • #日志文件,你需要改成你自己的路径
  • logfile=/data/wwwlogs/
  • last_minutes=1
  • #开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)
  • start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'
  • echo $start_time
  • #结束时间现在
  • stop_time=`date +"%Y-%m-%d %H:%M:%S"`
  • echo $stop_time
  • cur_date="`date +%Y-%m-%d`"
  • echo $cur_date
  • #过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径
  • 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 $logfile/log_ip_top10
  • ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
  • ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'`
  • # 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.log,这里为了测试设置2,你需要改成其它的数字
  • for line in $ip
  • do
  • echo $line >> $logfile/black.txt
  • echo $line
  • # 这里还可以执行CF的API来提交数据到CF防火墙
  • done
  • # 填Cloudflare Email邮箱
  • CFEMAIL="[email protected]"
  • # 填Cloudflare API key
  • CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"
  • # 填Cloudflare Zones ID 域名对应的ID
  • ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxx"
  • # /data/wwwlogs/black.txt存放恶意攻击的IP列表
  • # IP一行一个。
  • IPADDR=$(复制代码
  • 回复

    使用道具 举报

    15

    主题

    96

    回帖

    315

    积分

    中级会员

    积分
    315
    发表于 2019-8-27 21:41:39 | 显示全部楼层
    goaccess
    回复

    使用道具 举报

    0

    主题

    7

    回帖

    24

    积分

    新手上路

    积分
    24
    发表于 2019-8-27 22:15:38 | 显示全部楼层
    第6行
    [ol]
  • start_time=`date +"%Y-%m-%d %H:%M:%S" -d "-$last_minutes minutes"`[/ol]复制代码
  • 回复

    使用道具 举报

    20

    主题

    198

    回帖

    504

    积分

    高级会员

    积分
    504
     楼主| 发表于 2019-8-27 22:23:32 | 显示全部楼层

    Icarus 发表于 2019-8-27 22:15

    第6行

    嗯 这个是写固定了 数字1 输出的时间信息也对
    但是他分析的还是整个日志文件
    回复

    使用道具 举报

    5

    主题

    52

    回帖

    139

    积分

    注册会员

    积分
    139
    发表于 2019-8-27 22:15:00 | 显示全部楼层
    关键在第14行,你要看日志的时间是在$几。
    回复

    使用道具 举报

    219

    主题

    2133

    回帖

    5097

    积分

    论坛元老

    积分
    5097
    发表于 2019-8-27 22:26:47 | 显示全部楼层
    Cloudflare 自动脚本提交攻击(恶意)IP到防火墙[修改版],我自用脚本


    https://www.yunloc.com/652.html
    回复

    使用道具 举报

    76

    主题

    2994

    回帖

    6350

    积分

    论坛元老

    积分
    6350
    发表于 2019-8-27 22:28:25 | 显示全部楼层
    来学习一下
    回复

    使用道具 举报

    0

    主题

    7

    回帖

    24

    积分

    新手上路

    积分
    24
    发表于 2019-8-27 22:36:26 | 显示全部楼层

    qccj001 发表于 2019-8-27 22:23

    嗯 这个是写固定了 数字1 输出的时间信息也对
    但是他分析的还是整个日志文件 ...

    什么意思,是指它没按照你设定的时间分析,还是日志分析载入全文件你觉得不好?第一种情况看第14行,要看匹配规则跟你文件里面的格式是否匹配,第二种没什么问题。其它时间你只要改last_minutes就行了
    回复

    使用道具 举报

    20

    主题

    198

    回帖

    504

    积分

    高级会员

    积分
    504
     楼主| 发表于 2019-8-27 22:57:32 | 显示全部楼层
    本帖最后由 qccj001 于 2019-8-28 08:45 编辑

    lonefly 发表于 2019-8-27 22:28

    Cloudflare 自动脚本提交攻击(恶意)IP到防火墙[修改版],我自用脚本
    https://www.yunloc.com/652.htm ...


    你修改的试过吗?我试了下不行呢,日志格式是默认的。
    [ol]
  • 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"
  • 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"
  • 100.xxx.xxx.104 - - [27/Aug/2019:10:56:45 +0800] "GET /bo/222.html HTTP/1.1" 200 6789 "-" "MauiBot ([email protected])"
  • [/ol]复制代码




    ----------------------------
    修改第四列可以了
    tac $logfile/xxx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr(
    $4
    ,RSTART+14,21);if(t>=st && t $logfile/log_ip_top10

    还有个问题,如果每天不切割日志的话,你这个时间对比不带日期,会统计错误
  • 回复

    使用道具 举报

    219

    主题

    2133

    回帖

    5097

    积分

    论坛元老

    积分
    5097
    发表于 2019-8-27 22:23:00 | 显示全部楼层
    本帖最后由 lonefly 于 2019-8-28 10:08 编辑

    qccj001 发表于 2019-8-28 08:37

    你修改的试过吗?我试了下不行呢,日志格式是默认的。


    日志是每日切割了,不然太大了影响查询速度,脚本经过测试没问题,自用3个多月了



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

    或者你在conf 的http段添加:

    [ol]
  •         map $HTTP_CF_CONNECTING_IP $clientRealIp
  •                 {
  •              "" $remote_addr;
  •              ~^(?P[a-z0-9.:]+),?.*$ $firstAddr;
  •         }
  •         log_format access '$clientRealIp [$time_local] "$request" '
  •                           '$status $body_bytes_sent "$http_referer" '
  •                           '$http_user_agent $remote_addr $request_time';[/ol]复制代码

    CloudFlare获取网站日志真实IP地址
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|Discuz! X

    GMT+8, 2026-3-24 16:56 , Processed in 0.025360 second(s), 4 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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