ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用 Bash 解析 NGINX 与 Apache 访问日志:spike_check 日志汇总脚本实战(Introduction to Bash Scripting 第 20 章)

用 Bash 解析 NGINX 与 Apache 访问日志:spike_check 日志汇总脚本实战(Introduction to Bash Scripting 第 20 章) 用 Bash 解析 NGINX 与 Apache 访问日志spike_check 日志汇总脚本实战Introduction to Bash Scripting 第 20 章【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting本篇技术指南源自开源电子书《Introduction to Bash Scripting》的第 20 章BASH Script parser to Summarize Your NGINX and Apache Access Logs。当 Linux 服务器出现 CPU 飙升时访问日志往往是定位问题的第一现场而面对动辄数 GB 的原始日志纯手工排查既耗时又易出错。本文将带你用纯 Bash零额外依赖编写一个访问日志汇总脚本统计 GET / POST 请求最多的 Top 20 页面、按请求量排序的 Top 20 IP 及其地理位置从而快速判断是正常流量、恶意扫描还是暴力破解攻击。读完本文你将掌握awk字段提取、sort | uniq -c | sort -rn | head经典管道链、IP 地理定位与 shellcheck 校验的完整实战技能。为什么需要日志汇总脚本CPU 飙升排查的第一现场在生产环境中我们通常会在第一件事是使用top或htop查看进程列表。如果在进程列表中发现大量 Apache 或 Nginx 进程下一步就该快速检查访问日志判断是什么请求导致了 CPU 飙升或者是否有人在执行恶意操作——例如针对 WordPress 的xmlrpc.php暴力破解。但直接阅读原始日志常常令人望而生畏日志文件可能非常庞大手工翻阅耗时巨大原始日志格式对经验不足的人并不友好字段混杂、信息密度低。正如章节开篇所说这不是一篇讲解而是一次挑战你需要编写一个短小的 Bash 脚本在不安装任何额外软件的前提下把整个访问日志汇总成几条可读的结论。脚本需求三条核心汇总输出该章节定义的脚本需要解析并汇总访问日志输出三类实用信息汇总项说明POST 请求最多的 Top 20 页面帮助发现表单滥用、xmlrpc.php暴力破解等异常写入流量GET 请求最多的 Top 20 页面帮助定位热点资源、抓取行为或异常的高频访问Top 20 IP 地址及地理位置帮助识别异常地域来源判断是否需要封禁这三项输出恰好覆盖了日志排查中最常问的三个问题谁在请求什么、用了什么方法、来自哪里。前置知识访问日志的字段结构要让脚本能解析日志首先必须理解标准访问日志的字段布局。Apache 与 Nginx 默认都遵循Common Log FormatCLF或Combined Log Format一行典型的日志形如127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] GET /index.html HTTP/1.0 200 2326按空白字符切分后关键字段在 awk 中的位置如下awk 字段内容示例$1客户端 IP 地址127.0.0.1$4、$5请求时间日期 时区[10/Oct/2000、13:55:36 -0700]$6HTTP 方法带前导引号GET或POST$7请求的 URL 路径/index.html$9状态码200$10响应字节数2326理解这一布局是编写解析脚本的基础IP 永远在$1方法在$6URL 在$7。这与电子书前面的章节知识一脉相承——如果你还不熟悉字段、参数与条件表达式可以先温习Bash 变量、Bash 参数与Bash 条件表达式。核心思路四段经典管道链整个汇总脚本的核心是一条在 Bash 中反复出现的数据处理管道awk {...提取字段...} 日志文件 | sort | uniq -c | sort -rn | head -20各环节的作用awk按字段切分每一行只提取目标字段如$7页面或$1IP并对方法做条件过滤sort将提取出的值排序使相同值相邻排列uniq -c去重并统计每个值的出现次数sort -rn按计数第一列反向排序让出现次数最多的排在前面head -20截取前 20 行即“Top 20”。这是一条标准且高效的日志统计管道全部由系统自带命令组成完全符合章节“不安装任何额外软件”的要求。参考实现一个可运行的 spike_check 脚本章节提供了配套的演示脚本存放于独立的quick_access_logs_summary配套仓库可在克隆后获得名为spike_check的可执行文件并鼓励读者先自己动手写再对照参考实现。下面给出一个严格满足章节三项需求、可直接运行的参考实现它综合运用了前面章节学到的参数处理、管道与 awk#!/bin/bash # spike_check - 汇总 NGINX / Apache 访问日志 # 用法: ./spike_check /path/to/access.log set -euo pipefail LOG_FILE${1:-} if [[ -z $LOG_FILE ]] || [[ ! -f $LOG_FILE ]]; then echo Usage: $0 /path/to/access.log exit 1 fi echo Top 20 pages by GET requests awk $6 ~ /^GET/ {print $7} $LOG_FILE \ | sort | uniq -c | sort -rn | head -20 echo echo Top 20 pages by POST requests awk $6 ~ /^POST/ {print $7} $LOG_FILE \ | sort | uniq -c | sort -rn | head -20 echo echo Top 20 IP addresses awk {print $1} $LOG_FILE \ | sort | uniq -c | sort -rn | head -20要点说明set -euo pipefail开启严格模式一旦管道中任一命令失败即退出避免静默错误——这是调试与测试章节反复强调的实践${1:-}从命令行读取日志路径参数对应Bash 参数若未传参或文件不存在脚本打印用法并退出而不是产生一堆无意义的空输出awk $6 ~ /^GET/ {print $7}用正则匹配第六字段是否以GET开头注意引号属于字段内容命中则输出第七字段的 URL三条管道分别输出 GET 页面、POST 页面与 IP 的 Top 20。如果希望进一步把“IP 地理位置”合并展示可以基于 IP 统计结果再调用公共 IP 地理定位服务返回 JSON并用电子书第 18 章介绍的jq解析出国家/地区信息例如awk {print $1} $LOG_FILE \ | sort | uniq -c | sort -rn | head -20 \ | while read -r count ip; do location$(curl -s https://ipinfo.io/$ip/json | jq -r .country) printf %s\t%s\t%s\n $count $ip $location done需要注意地理定位需要网络访问属于可选增强当日志行数极大时逐 IP 调用外部服务会有明显耗时建议只对 Top 20 执行。运行方式下载、授权、执行章节给出的运行流程非常简洁——只要让脚本可执行然后传入日志路径即可chmod x spike_check ./spike_check /path/to/your/access_log其中/path/to/your/access_log需要替换为实际的日志路径ApacheUbuntu/Debian 默认路径./spike_check /var/log/apache2/access.logNginx默认路径./spike_check /var/log/nginx/access.log章节特别强调该脚本不会对系统做任何修改它只读取访问日志内容并输出汇总不过在运行从网络下载的脚本之前务必先自行审查脚本内容确认没有恶意代码——这是一条值得固化为习惯的安全准则。关于脚本体积日志越大运行耗时越长这是正常的。汇总本身就是一次全量扫描awk逐行处理大文件非常高效通常远快于人工翻阅。输出解读从 Top 列表识别攻击迹象脚本输出的每行由“出现次数 目标”组成例如16 /xmlrpc.php章节用一个真实案例说明了如何解读这类输出某次运行显示xmlrpc.php收到了16 次 POST 请求。xmlrpc.php是 WordPress 的一个系统文件经常被攻击者利用来组合不同的用户名与密码进行暴力破解。虽然 16 次请求算不上大规模攻击但它是一个早期预警信号——据此可以提前采取措施防止未来演变成更大规模的攻击。同样的逻辑适用于 IP 地理位置输出如果汇总结果中出现了一批来自某国家/地区的 IP而你并不预期有来自该地域的流量就应当考虑在防火墙或 WAF 层面封禁这些地址。因此这份脚本的核心价值在于把“大海捞针”式的日志排查压缩为三条 Top 20 列表让异常在几秒内现形。与仓库其他内容的衔接写得更健壮本仓库不仅包含这一章的讲解还提供了完整的质量保障机制可以让你的脚本更接近“生产可用”仓库的scripts/shellcheck-ebook.sh会从英文版各章节的 markdown 中提取所有 bash 代码块并对每块执行shellcheck -S warning静态检查它对代码片段专门排除了SC2034变量看似未使用、SC2154变量未赋值即引用、SC2145参数混合字符串与数组等教学场景相关的告警。你完全可以仿照这一思路对自己的spike_check运行shellcheck来发现潜在问题在让脚本全局可用时可参考创建自定义 Bash 命令将脚本软链接到PATH中的目录之后就能在任何位置直接执行若想对输出做进一步加工如按状态码过滤、只统计 4xx/5xx可结合Bash 循环与Bash 条件表达式扩展管道整个电子书的章节地图见仓库 README.md本主题属于“真实场景实战”部分此前的基础章节变量、参数、数组、循环、函数是理解本脚本的必要前提。注意事项与适用前提日志格式差异上述字段位置基于标准 Combined Log Format。如果你自定义了 log_formatNginx 常见做法$6、$7的语义可能改变需要同步调整 awk 字段编号大小写与方法匹配$6 ~ /^GET/是大小写敏感匹配若日志中出现小写方法或额外引号需视实际情况调整正则地理定位需要联网Geo 信息来自公共服务属于可选功能且应注意服务的使用限制与隐私策略权限/var/log/nginx/access.log等路径通常需要 root 或日志组成员权限才能读取请以合适用户身份运行。结论这是一个典型的“小而美”的 Bash 实战不依赖任何第三方软件仅用系统自带的awk、sort、uniq、head管道组合就完成了一次完整的访问日志体检。它的价值在于两点——速度几秒内得到全局视图与洞察从 Top 列表中快速识别暴力破解与异常地域流量。当然对于关键日志手工抽查仍然必要但把日常的“例行检查”自动化正是 Bash 脚本最值得投入的方向。不妨现在就按本章挑战写一个你自己的版本再与配套演示脚本对照把这段经典管道链变成你的肌肉记忆。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表