Shell脚本监控网站页面关键词,检测页面劫持
网站页面被劫持或篡改是运维中常见的安全问题,轻则影响用户体验,重则导致搜索引擎降权。
通过 Shell 脚本定期抓取页面并检查关键内容是否缺失或异常,可以第一时间发现劫持迹象。
本文面向零基础用户,从准备到验证一步步讲解如何实现关键词监控,最终你能得到一个可定时运行、异常时发送告警的检测脚本。
准备工作:明确监控目标和环境
在动手写脚本前,先确定你要监控的页面 URL 和必须存在的关键词。
例如首页的标题、备案号、版权信息或某个核心功能词。
这些词正常时应该出现在 HTML 中,如果突然消失或被替换,就可能是被劫持。
你需要一台能访问目标网站的 Linux 服务器,并安装 curl 和 cron(大多数系统自带)。
检查命令:
which curl crontab
如果 curl 未安装,用包管理器安装,例如 apt install curl 或 yum install curl。
编写检测脚本:抓取页面并比对关键词
创建一个脚本文件,比如 /opt/check_hijack.sh,内容如下:
#!/bin/bash
# 网站页面关键词监控脚本
URL="https://你的域名.com"
KEYWORDS=("公司名" "备案号" "版权所有")
TMPFILE=$(mktemp)
# 抓取页面,-L 跟随跳转,-s 静默,--max-time 设置超时
curl -L -s --max-time 15 "$URL" -o "$TMPFILE"
# 检查 HTTP 状态码(可选但推荐)
HTTP_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" --max-time 15 "$URL")
if [ "$HTTP_CODE" -ne 200 ]; then
echo "警告:$URL 返回状态码 $HTTP_CODE" | mail -s "网站异常" admin@example.com
fi
# 检查每个关键词是否存在
for kw in "${KEYWORDS[@]}"; do
if ! grep -q "$kw" "$TMPFILE"; then
echo "警告:关键词 [$kw] 未在 $URL 中找到,可能被劫持或页面异常" | mail -s "关键词丢失" admin@example.com
fi
done
rm -f "$TMPFILE"
关键点说明:
KEYWORDS数组里填入你希望页面必须包含的文字,建议选择劫持者难以完全模拟的内容,比如备案号。curl的--max-time防止因网络卡死导致脚本挂起。- 邮件发送需要系统配置好
mail命令,如果未配置,可以先将告警写入日志文件,例如echo "..." >> /var/log/hijack.log。
保存后赋予执行权限:
chmod +x /opt/check_hijack.sh
设置定时任务:让脚本自动运行
使用 crontab -e 添加一行,比如每 10 分钟检查一次:
*/10 * * * * /opt/check_hijack.sh >/dev/null 2>&1
保存退出后,可以用 crontab -l 查看是否生效。
如果不想用邮件,可以把脚本中的邮件命令替换成写入日志,然后通过日志监控工具查看。
避坑指南:常见问题与优化建议
- 关键词选择要谨慎:不要选太短或常见的词,否则劫持者只要保留这个词就能绕过检测。建议组合多个特征词。
- HTTPS 证书问题:如果目标站点证书过期或自签名,
curl会报错。可加-k参数忽略证书验证,但仅建议在测试环境使用。 - 页面动态加载:如果关键词是通过 JavaScript 动态渲染的,
curl抓不到。此时需要改用无头浏览器工具,如puppeteer或playwright,但这超出 Shell 脚本范围。 - 误报处理:网络抖动可能导致抓取失败,建议脚本中重试 2 次,或连续两次检测失败再告警,避免频繁误报。
验证效果:模拟劫持测试
脚本写好后,可以手动模拟关键词丢失来验证告警是否正常。
临时修改脚本中的 URL 为一个不存在关键词的页面,或者注释掉某个关键词的检查,运行脚本观察是否收到告警。
/opt/check_hijack.sh
如果配置了邮件,检查邮箱;
如果写日志,检查日志文件。
确认无误后,再将脚本恢复并放入定时任务。
常见疑问
问:脚本只能监控一个页面吗?
可以修改脚本,用循环处理多个 URL,把 URL 和关键词列表放在数组或单独的文件中读取。
问:没有邮件服务器怎么办?
可以用 Server 酱、钉钉机器人等 Webhook 替代邮件,只需将 curl 发送 POST 请求的代码替换掉 mail 命令即可。
问:多久检查一次合适?
根据网站更新频率和安全要求决定。一般 5-15 分钟一次能较好平衡及时性和资源消耗。
问:如何避免脚本被劫持者发现?
脚本本身放在服务器本地,不要公开访问。同时可以定期更换检查关键词和检查时间,增加绕过难度。
通过以上步骤,你已经能用 Shell 脚本监控网站页面关键词,及时发现页面劫持迹象。
建议先从简单的单页面监控开始,稳定后再扩展到多页面和多种告警方式。