#!/usr/bin/env bash # ============================================================================ # MAX HTTPDiag — HTTP/HTTPS 请求诊断 # 原创脚本,受 htrace.sh (trimstray/htrace.sh) 的 HTTP 调试理念启发 # 但更轻量、中文输出、集成常用调试场景 # # 风险等级: 🟢 只读 — 不修改任何系统设置 # 用法: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-httpdiag.sh) https://example.com # ============================================================================ set -e R='\033[1;31m' G='\033[1;32m' Y='\033[1;33m' B='\033[1;34m' C='\033[1;36m' M='\033[1;35m' W='\033[1;37m' N='\033[0m' GR='\033[90m' if [ -z "$1" ]; then echo -e "${R}用法: bash max-httpdiag.sh ${N}" echo -e " 示例: bash max-httpdiag.sh https://example.com" exit 1 fi URL="$1" echo -e "${B}┌─────────────────────────────────────────────┐${N}" echo -e "${B}│${N} ${G}MAX HTTP 请求诊断${N} ${GR}(只读)${N}" echo -e "${B}└─────────────────────────────────────────────┘${N}" echo echo -e " ${C}目标:${N} ${W}$URL${N}" echo # 1. DNS 解析 echo -e " ${M}1. DNS 解析${N}" echo -e " ${GR}───${N}" domain=$(echo "$URL" | sed 's|https\?://||' | cut -d/ -f1) if command -v dig &>/dev/null; then dig +short "$domain" 2>/dev/null | head -5 | while read -r ip; do echo -e " ${G}$ip${N}" done elif command -v nslookup &>/dev/null; then nslookup "$domain" 2>/dev/null | grep Address | grep -v '#' else getent hosts "$domain" 2>/dev/null | awk '{print " " $1}' fi # 2. TCP 连接 echo -e "\n ${M}2. TCP 握手延迟${N}" echo -e " ${GR}───${N}" port=$(echo "$domain" | grep -oP ':\K\d+' || [ "${URL:0:5}" = "https" ] && echo "443" || echo "80") time_start=$(date +%s%N) timeout 3 bash -c "echo >/dev/tcp/$domain/$port" 2>/dev/null && { time_end=$(date +%s%N) elapsed=$(( (time_end - time_start) / 1000000 )) echo -e " ${G}${elapsed}ms${N} ${GR}连接到 $domain:$port${N}" } || echo -e " ${R}连接失败${N}" # 3. HTTP 响应头 echo -e "\n ${M}3. HTTP 响应头${N}" echo -e " ${GR}───${N}" curl -sI -o /tmp/httpdiag_headers_$$.txt -w "\n---STATS---\nHTTP_CODE: %{http_code}\nTIME_TOTAL: %{time_total}s\nTIME_CONNECT: %{time_connect}s\nTIME_TTFB: %{time_starttransfer}s\nSPEED: %{speed_download}B/s\nSIZE: %{size_download}B\n" --max-time 10 "$URL" 2>/dev/null || echo -e " ${R}请求失败${N}" if [ -f /tmp/httpdiag_headers_$$.txt ]; then sed -n '1,/^---STATS---$/p' /tmp/httpdiag_headers_$$.txt | grep -iv '^$' | while read -r line; do echo -e " ${GR}$line${N}" done grep -A100 '^---STATS---' /tmp/httpdiag_headers_$$.txt | tail -n +2 | while read -r line; do echo -e " ${Y}$line${N}" done fi rm -f /tmp/httpdiag_headers_$$.txt # 4. 证书信息 (HTTPS) echo -e "\n ${M}4. TLS 证书${N}" echo -e " ${GR}───${N}" if [ "${URL:0:5}" = "https" ]; then echo | openssl s_client -connect "$domain:$port" -servername "$domain" 2>/dev/null | openssl x509 -noout -dates -subject -issuer 2>/dev/null | while read -r line; do echo -e " ${C}$line${N}" done || echo -e " ${R}证书信息获取失败${N}" else echo -e " ${GR}非 HTTPS 连接,跳过证书检查${N}" fi echo echo -e "${GR}👉 网络连接分析: max-netstat.sh | 实时 ping: max-pingmon.sh${N}"