最近总有小学生来搞事,网上找了下发现有BUG不能用,求会shell的大佬帮个忙
分析nginx最近N分钟的日志,N分钟内某IP访问M次就记录到txt里。下面这个是网上找的,时间那里不对,分析的是整个日志文件,搞了半天不会写。顺便吐槽一下shell,空格、单双引号 搞的脑壳疼
- #/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<=et) {print $0}}’ | awk ‘{print $1}’ | sort | uniq -c | sort -nr > $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=$(</data/wwwlogs/black.txt)
- # 循环提交 IPs 到 Cloudflare 防火墙黑名单
- # 模式(mode)有 block, challenge, whitelist, js_challenge
- for IPADDR in ${IPADDR[@]}; do
- echo $IPADDR
- curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
- -H "X-Auth-Email: $CFEMAIL" \
- -H "X-Auth-Key: $CFAPIKEY" \
- -H "Content-Type: application/json" \
- –data ‘{"mode":"block","configuration":{"target":"ip","value":"’$IPADDR’"},"notes":"CC Attatch"}’
- done
- # 删除 IPs 文件收拾干净
- rm -rf /data/wwwlogs/black.txt
复制代码
陕西网友:goaccess
山西网友:第6行
- 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就行了
天津网友:
你修改的试过吗?我试了下不行呢,日志格式是默认的。
- 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])"
复制代码
—————————-
修改第四列可以了
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段添加:
- map $HTTP_CF_CONNECTING_IP $clientRealIp
- {
- "" $remote_addr;
- ~^(?P<firstAddr>[a-z0-9.:]+),?.*$ $firstAddr;
- }
- log_format access ‘$clientRealIp [$time_local] "$request" ‘
- ‘$status $body_bytes_sent "$http_referer" ‘
- ‘$http_user_agent $remote_addr $request_time’;
复制代码
CloudFlare获取网站日志真实IP地址
未经允许不得转载:美国VPS_搬瓦工CN2 GIA VPS » 求分析nginx日志的shell脚本