本文目录导读:

我来介绍几种使用Shell脚本分析日志中异常请求的常用方法:
基础异常分析脚本
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
REPORT_FILE="/tmp/abnormal_report.txt"
# 清空旧报告
> $REPORT_FILE
echo "=== 异常请求分析报告 ===" > $REPORT_FILE
echo "分析时间: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 1. 统计4xx和5xx状态码
echo "=== 4xx/5xx 错误请求统计 ===" >> $REPORT_FILE
awk '{print $9}' $LOG_FILE | grep -E '^[45][0-9]{2}$' | sort | uniq -c | sort -rn >> $REPORT_FILE
# 2. 统计返回404最多的URL
echo "" >> $REPORT_FILE
echo "=== 404错误最多的URL ===" >> $REPORT_FILE
awk '$9 == 404 {print $7}' $LOG_FILE | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE
# 3. 统计请求量异常的IP
echo "" >> $REPORT_FILE
echo "=== 请求量异常IP (超过100次) ===" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn | awk '$1 > 100 {print}' >> $REPORT_FILE
实时异常监控脚本
#!/bin/bash
# 实时监控日志中的异常
tail -f /var/log/nginx/access.log | while read line; do
# 提取状态码
status_code=$(echo $line | awk '{print $9}')
# 检查异常状态码
if [[ $status_code =~ ^[45][0-9]{2}$ ]]; then
ip=$(echo $line | awk '{print $1}')
url=$(echo $line | awk '{print $7}')
time=$(echo $line | awk '{print $4}' | tr -d '[')
echo "[WARNING] 异常请求: $time | IP: $ip | 状态码: $status_code | URL: $url"
fi
# 检测异常请求频率(同一IP的请求间隔)
# 可以在这里添加更复杂的逻辑
done
综合异常分析系统
#!/bin/bash
LOG_DIR="/var/log/nginx"
CURRENT_DATE=$(date +%Y-%m-%d)
analyze_abnormal_requests() {
local log_file="$1"
echo "=== 分析日志文件: $log_file ==="
# 1. SQL注入尝试检测
echo "### SQL注入尝试检测 ###"
grep -i -E "(union.*select|select.*from|insert into|delete from|drop table)" $log_file | \
awk '{print $1, $7, $9}' | sort -u
# 2. XSS攻击尝试检测
echo "### XSS攻击尝试检测 ###"
grep -i -E "(<script|<iframe|alert\(|onerror=|onload=)" $log_file | \
awk '{print $1, $7, $9}' | sort -u
# 3. 路径遍历尝试检测
echo "### 路径遍历尝试检测 ###"
grep -E "\.\./|\.\.\\\\" $log_file | awk '{print $1, $7, $9}' | sort -u
# 4. 扫描器检测
echo "### 爬虫/扫描器检测 ###"
grep -i -E "(sqlmap|nikto|nmap|nessus|acunetix)" $log_file | \
awk '{print $1, $7, $9}' | sort -u
# 5. 短时间内高频访问检测
echo "### 高频访问IP检测 (10秒内超过50次) ###"
awk '{print $1, $4}' $log_file | sort | \
awk '{
ip=$1
time=$2
if (ip != last_ip) {
count=1
start_time=time
} else {
count++
if (count > 50 && time_diff < 10) {
print ip " 在短时间内访问了" count "次"
}
}
last_ip=ip
}'
}
# 按需分析
case "$1" in
"daily")
analyze_abnormal_requests "$LOG_DIR/access.log"
;;
"realtime")
# 实时监控
tail -f "$LOG_DIR/access.log" | while read line; do
# 实时分析逻辑
echo "$line" | grep -E "error|warning|403|404|500|502|503" && \
echo "[$(date)] 发现异常: $line"
done
;;
*)
echo "用法: $0 {daily|realtime}"
exit 1
;;
esac
高级异常分析脚本
#!/bin/bash
# 定义异常模式
declare -A PATTERNS
PATTERNS["SQL注入"]="(union.*select|select.*from|insert into|drop table|delete from|--|#|/\*)"
PATTERNS["XSS攻击"]="(<script|<iframe|alert\(|onerror=|onload=|javascript:)"
# 检测并报告
detect_anomalies() {
local log_file=$1
local output_file="/tmp/anomalies_$(date +%Y%m%d_%H%M%S).txt"
echo "开始检测异常请求..." > $output_file
for pattern_name in "${!PATTERNS[@]}"; do
echo "检测: $pattern_name" >> $output_file
# 使用grep的-P选项支持Perl正则
grep -P "${PATTERNS[$pattern_name]}" $log_file | \
awk '{ip=$1; url=$7; status=$9; print ip" | "status" | "url}' >> $output_file
echo "---" >> $output_file
done
# 生成统计
echo "=== 异常统计 ===" >> $output_file
for pattern_name in "${!PATTERNS[@]}"; do
count=$(grep -cP "${PATTERNS[$pattern_name]}" $log_file)
echo "$pattern_name: $count 次" >> $output_file
done
echo "报告已生成: $output_file"
}
# 执行检测
detect_anomalies "/var/log/nginx/access.log"
使用技巧
实时监控并告警
#!/bin/bash
# 添加告警功能
threshold=100
ip_count=$(tail -1000 access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -1 | awk '{print $1}')
if [ "$ip_count" -gt "$threshold" ]; then
echo "检测到异常流量,发送告警..."
# mail -s "异常流量告警" admin@example.com < /tmp/report.txt
fi
日志旋转后分析
#!/bin/bash
# 分析昨天的日志
yesterday=$(date -d "yesterday" +%Y%m%d)
log_file="/var/log/nginx/access.log.$yesterday"
if [ -f "$log_file" ]; then
analyze_abnormal_requests "$log_file"
fi
这些脚本可以帮助你:
- 快速识别异常请求
- 发现潜在的安全威胁
- 生成分析报告
- 实现实时监控
根据具体需求选择合适的脚本,并可以组合使用不同的分析方法。