#!/bin/bash # 测看门狗的重启路径。 # # 做法:把失败计数预置成 2,再跑一次 —— 应该触发第 3 次并重启隧道。 # 然后验证它有没有把隧道救回来。 set -u RELAY_DIR=/root/lanremote-relay echo "===== 1. 测之前的状态 =====" echo " 失败计数: $(cat $RELAY_DIR/watchdog.state 2>/dev/null || echo 0)" URL_BEFORE=$(cat "$RELAY_DIR/public_url.txt" 2>/dev/null || echo "") echo " 公网地址: ${URL_BEFORE:-(无)}" echo " 隧道服务: $(systemctl is-active lanremote-tunnel)" echo " 隧道重启次数: $(systemctl show lanremote-tunnel -p NRestarts | cut -d= -f2)" echo echo "===== 2. 确认公网确实不通 =====" if [ -n "$URL_BEFORE" ]; then C=$(timeout 20 curl -4 -s -o /dev/null -w '%{http_code}' \ "$URL_BEFORE/v1/health" 2>/dev/null) echo " 从设备访问自己的公网地址: HTTP ${C:-超时}" fi echo echo "===== 3. 把失败计数预置成 2,再跑一次看门狗 =====" echo 2 > "$RELAY_DIR/watchdog.state" echo " 预置完成(再失败一次就该重启了)" echo systemctl start lanremote-watchdog.service echo " 看门狗已跑" echo echo "===== 4. 等它重启并拿到新地址 =====" sleep 45 echo " 看门狗日志:" tail -6 "$RELAY_DIR/watchdog.log" 2>/dev/null | sed 's/^/ /' echo echo " 隧道重启次数: $(systemctl show lanremote-tunnel -p NRestarts | cut -d= -f2)" URL_AFTER=$(cat "$RELAY_DIR/public_url.txt" 2>/dev/null || echo "") echo " 新公网地址: ${URL_AFTER:-(还没拿到)}" echo echo "===== 5. 验证新地址通不通 =====" if [ -n "$URL_AFTER" ]; then OK=0 for i in 1 2 3 4 5; do C=$(timeout 20 curl -4 -s -o /dev/null -w '%{http_code}' \ "$URL_AFTER/v1/health" 2>/dev/null) printf " 第 %d 次: HTTP %s\n" "$i" "${C:-超时}" if [ "$C" = "200" ]; then OK=1; break; fi sleep 8 done echo if [ "$OK" = "1" ]; then echo " ✓ 看门狗把隧道救回来了" if [ "$URL_BEFORE" != "$URL_AFTER" ]; then echo " 地址变了: $URL_BEFORE" echo " -> $URL_AFTER" echo " (匿名隧道就这样,用户从 http://192.168.2.156:8080/url 查新地址)" fi else echo " ✗ 新地址还是不通(这条线路对匿名隧道就是不友好)" fi fi