0

curl定时检测重定向生成日报脚本:3个实战方案让网站巡检数据自动汇报

2026.06.15 | youres | 7次围观

为什么要用curl定时检测重定向并生成日报

网站重定向问题往往是慢慢暴露的——某个短链的UTM参数开始丢失,某个域名悄然多跳了一层,某个CDN节点把HTTPS跳转改成了302。如果没人盯着,这些问题可能持续数周才被发现。

手动检测?每天跑一遍curl命令?这不是运维该干的事。正确做法是:写一个Shell脚本,用curl检测重定向,通过crontab定时执行,自动生成日报推送到邮箱或钉钉群。

本文提供3个实战方案,分别输出CSV日报、JSON日报和HTML日报,覆盖从数据收集到结果推送的完整链路。

方案一:CSV日报脚本——最轻量、最实用

核心思路

curl -L -w输出重定向变量,追加到CSV文件,crontab每天执行一次,日志轮转防止文件过大,最后通过邮件发送日报。

完整脚本

#!/bin/bash
# redirect_daily_csv.sh — curl定时检测重定向生成CSV日报
# 配置区
URL_LIST="/etc/redirect_monitor/urls.txt"
REPORT_DIR="/var/log/redirect_reports"
CSV_FILE="$REPORT_DIR/redirect_$(date +%Y%m%d).csv"
MAX_REDIRECTS=5
TIMEOUT=10

# 创建目录
mkdir -p "$REPORT_DIR"

# CSV表头
echo "URL,Status_Code,Num_Redirects,Final_URL,Total_Time,Date" > "$CSV_FILE"

# 逐个检测
while IFS= read -r url; do
  [ -z "$url" ] && continue
  result=$(curl -L -s -o /dev/null \
    -w "%{http_code},%{num_redirects},%{url_effective},%{time_total}" \
    --max-redirs "$MAX_REDIRECTS" \
    -m "$TIMEOUT" \
    "$url")
  echo "${url},${result},$(date +%Y-%m-%d%%H:%M:%S)" >> "$CSV_FILE"
done < "$URL_LIST"

# 发送邮件
echo "今日重定向巡检日报见附件" | \
  mail -s "重定向日报 $(date +%Y-%m-%d)" \
  -a "$CSV_FILE" ops@example.com

crontab配置

# 每天早上8点执行
0 8 * * * /opt/scripts/redirect_daily_csv.sh

关键细节

  • URL列表文件:一行一个URL,支持注释行(用#开头)
  • --max-redirs:防止无限重定向循环卡死脚本
  • -m参数:超时保护,单个URL超过10秒直接放弃
  • 日志轮转:文件名带日期,自动按天分文件

方案二:JSON日报脚本——结构化数据,方便二次处理

核心思路

每个URL检测结果输出为JSON对象,所有结果拼接成JSON数组,用jq做格式校验和统计汇总,日报推送钉钉Webhook。

完整脚本

#!/bin/bash
# redirect_daily_json.sh — curl定时检测重定向生成JSON日报
URL_LIST="/etc/redirect_monitor/urls.txt"
REPORT_DIR="/var/log/redirect_reports"
JSON_FILE="$REPORT_DIR/redirect_$(date +%Y%m%d).json"
DING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
MAX_REDIRECTS=5
TIMEOUT=10

mkdir -p "$REPORT_DIR"

# JSON数组开头
echo "[" > "$JSON_FILE"
first=true

while IFS= read -r url; do
  [ -z "$url" ] && continue
  
  # 一次curl取所有变量(用-w模板)
  format='{"http_code":"%{http_code}","num_redirects":"%{num_redirects}","url_effective":"%{url_effective}","time_total":"%{time_total}"}'
  result=$(curl -L -s -o /dev/null -w "$format" --max-redirs "$MAX_REDIRECTS" -m "$TIMEOUT" "$url")
  
  if [ "$first" = true ]; then
    first=false
  else
    echo "," >> "$JSON_FILE"
  fi
  
  echo "$result" | jq --arg url "$url" --arg date "$(date +%Y-%m-%dT%H:%M:%S)" '. + {"url":$url,"date":$date}' >> "$JSON_FILE"
done < "$URL_LIST"

# JSON数组结尾
echo "]" >> "$JSON_FILE"

# jq校验和统计
abnormal=$(jq '[.[] | select(.num_redirects | tonumber > 2 or .http_code != "200")] | length' "$JSON_FILE")

# 推送钉钉
summary="今日重定向巡检:异常${abnormal}条,共$(jq length "$JSON_FILE")个URL"
payload=$(jq -n --arg text "$summary" '{"msgtype":"text","text":{"content":$text}}')
curl -s "$DING_WEBHOOK" -H 'Content-Type: application/json' -d "$payload"

优化要点

用-w模板一次curl取所有变量,避免对同一个URL反复请求4次。性能提升明显,尤其是URL列表较长时。

方案三:HTML日报脚本——可视化、可分享

核心思路

检测结果写入HTML表格,表格按异常程度排序(重定向次数多排前面),生成完整HTML页面,通过邮件发送或推送到Web服务器供浏览器查看。

完整脚本

#!/bin/bash
# redirect_daily_html.sh — curl定时检测重定向生成HTML日报
URL_LIST="/etc/redirect_monitor/urls.txt"
REPORT_DIR="/var/log/redirect_reports"
HTML_FILE="$REPORT_DIR/redirect_$(date +%Y%m%d).html"
MAX_REDIRECTS=5
TIMEOUT=10

mkdir -p "$REPORT_DIR"

# HTML开头
cat > "$HTML_FILE" << 'HEADER'
<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>重定向巡检日报</title>
<style>
body{font-family:sans-serif;margin:20px}
table{border-collapse:collapse;width:100%}
th,td{border:1px solid #ddd;padding:8px;text-align:left}
th{background:#4CAF50;color:white}
.warn{background:#fff3cd}
.danger{background:#f8d7da}
</style></head><body>
<h1>网站重定向巡检日报</h1>
HEADER

# 检测并写入表格行
while IFS= read -r url; do
  [ -z "$url" ] && continue
  result=$(curl -L -s -o /dev/null \
    -w "%{http_code}|%{num_redirects}|%{url_effective}|%{time_total}" \
    --max-redirs "$MAX_REDIRECTS" -m "$TIMEOUT" "$url")
  
  http_code=$(echo "$result" | cut -d'|' -f1)
  num_redir=$(echo "$result" | cut -d'|' -f2)
  final_url=$(echo "$result" | cut -d'|' -f3)
  time_total=$(echo "$result" | cut -d'|' -f4)
  
  if [ "$num_redir" -ge 3 ] || [ "$http_code" != "200" ]; then
    level="danger"; status="异常"
  elif [ "$num_redir" -ge 2 ]; then
    level="warn"; status="关注"
  else
    level=""; status="正常"
  fi
  
  echo "<tr class=\"$level\"><td>$url</td><td>$http_code</td><td>$num_redir</td><td>$final_url</td><td>$time_total</td><td>$status</td></tr>" >> "$HTML_FILE"
done < "$URL_LIST"

# HTML结尾
cat >> "$HTML_FILE" << 'FOOTER'
</table></body></html>
FOOTER

3个方案对比选哪个

  • CSV日报:最轻量,邮件附件发送,适合Excel二次分析和小团队日常巡检
  • JSON日报:结构化数据,推送钉钉/飞书Webhook,适合程序二次处理和大团队告警联动
  • HTML日报:可视化展示,推送Web服务器或邮件,适合领导汇报和跨部门分享

实际运维中,建议CSV+JSON并行:CSV留本地做长期存档,JSON推送钉钉做实时告警。HTML日报按需生成,比如每周汇总一次。

crontab环境变量踩坑提醒

crontab的环境变量和交互式Shell不同,最常见的问题是PATH缺失导致curl找不到。解决方法:在脚本开头手动设置PATH,或者用绝对路径调用curl。

# 脚本开头加这两行,防止crontab环境问题
export PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash

另一个坑是百分号%。crontab配置文件中%是特殊字符,表示换行。如果你的命令里有日期格式$(date +%Y%m%d),在crontab里必须转义为\%。

# crontab里的百分号必须转义
0 8 * * * /opt/scripts/redirect_daily_csv.sh >> /var/log/redirect_$(date +\%Y\%m\%d).log 2>&1

日志轮转防止磁盘撑爆

日报文件日积月累会占大量磁盘。用logrotate配置自动轮转和清理:

/var/log/redirect_reports/redirect_*.csv {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

保留30天日报,超过自动压缩删除。JSON和HTML日报同理配置。

相关文章推荐

总结

curl定时检测重定向生成日报,核心是三个环节:curl -L -w采集数据Shell脚本格式化输出crontab定时触发推送。CSV方案最轻量实用,JSON方案方便程序对接,HTML方案适合汇报展示。选一个适合你团队的方案先跑起来,后续根据需求叠加即可。

记住两个crontab踩坑点:PATH环境变量和%百分号转义。加上logrotate日志轮转,这套日报系统就能稳定长期运行了。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论