为什么要用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批量重定向检测crontab定时任务:3个实战方案让网站巡检自动化
- curl重定向监控脚本crontab配置详解:3个实战方案让网站跳转异常自动告警
- xargs并行curl批量检测重定向:3个实战脚本让网站巡检效率提升10倍
总结
curl定时检测重定向生成日报,核心是三个环节:curl -L -w采集数据、Shell脚本格式化输出、crontab定时触发推送。CSV方案最轻量实用,JSON方案方便程序对接,HTML方案适合汇报展示。选一个适合你团队的方案先跑起来,后续根据需求叠加即可。
记住两个crontab踩坑点:PATH环境变量和%百分号转义。加上logrotate日志轮转,这套日报系统就能稳定长期运行了。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论