#!/bin/bash # SSH反向隧道自动重连脚本 # 配置参数 REMOTE_HOST="123.56.98.4" REMOTE_USER="root" REMOTE_PORT=22 TUNNEL_PORT=2222 LOCAL_PORT=22 CHECK_INTERVAL=60 # 检查间隔(秒) echo "=== SSH反向隧道自动重连脚本 ===" echo "远程服务器: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}" echo "隧道端口: ${TUNNEL_PORT} -> localhost:${LOCAL_PORT}" echo "检查间隔: ${CHECK_INTERVAL}秒" echo "" # 检查SSH是否安装 if ! command -v ssh &> /dev/null; then echo "错误: SSH客户端未安装,请先运行 ssh_tunnel_setup.sh" exit 1 fi # 函数:建立SSH隧道 establish_tunnel() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] 建立SSH反向隧道..." # 先检查是否已有连接 PID=$(pgrep -f "ssh.*-R.*${TUNNEL_PORT}:localhost:${LOCAL_PORT}.*${REMOTE_USER}@${REMOTE_HOST}") if [ ! -z "$PID" ]; then echo "发现已有隧道进程 (PID: $PID),先关闭..." kill $PID 2>/dev/null sleep 2 fi # 建立新连接 ssh -fN -R ${TUNNEL_PORT}:localhost:${LOCAL_PORT} \ -o ServerAliveInterval=30 \ -o ServerAliveCountMax=3 \ -o ExitOnForwardFailure=yes \ -o StrictHostKeyChecking=no \ -p ${REMOTE_PORT} \ ${REMOTE_USER}@${REMOTE_HOST} if [ $? -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ 隧道建立成功" return 0 else echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ 隧道建立失败" return 1 fi } # 函数:检查隧道是否存活 check_tunnel() { PID=$(pgrep -f "ssh.*-R.*${TUNNEL_PORT}:localhost:${LOCAL_PORT}.*${REMOTE_USER}@${REMOTE_HOST}") if [ ! -z "$PID" ]; then # 检查进程是否真的在运行 if ps -p $PID > /dev/null 2>&1; then return 0 fi fi return 1 } # 主循环 echo "开始监控SSH隧道..." establish_tunnel while true; do sleep ${CHECK_INTERVAL} if ! check_tunnel; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠ 检测到隧道断开,重新连接..." establish_tunnel else echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ 隧道连接正常" fi done