#!/bin/bash
KEY="my-bastion-host-key-pair.pem"
USER="ec2-user"
HOST="ec2-YYY-YYY-YYY-YYY.compute-1.amazonaws.com"
REMOTE_HOST="docdb-dima-1.cluster-xxxxxxxxxxxx.us-east-1.docdb.amazonaws.com"
LOCAL_PORT=27088
REMOTE_PORT=27017
MAX_RETRIES=5
RETRY_DELAY=30
function start_tunnel() {
ssh -i "$KEY" \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
-o ConnectTimeout=10 \
-L ${LOCAL_PORT}:${REMOTE_HOST}:${REMOTE_PORT} \
${USER}@${HOST} -N &
return $!
}
function monitor_tunnel() {
local pid=$1
local retry_count=0
while [ $retry_count -lt $MAX_RETRIES ]; do
if kill -0 $pid 2>/dev/null; then
printf "\r⏱️ SSH隧道活跃中... (重试次数: %d)" "$retry_count"
sleep 60
else
printf "\n❌ SSH隧道断开,尝试重连...\n"
kill $pid 2>/dev/null
sleep $RETRY_DELAY
start_tunnel
pid=$!
retry_count=$((retry_count + 1))
fi
done
printf "\n❌ 达到最大重试次数,停止重连。\n"
}
# 启动初始隧道
start_tunnel
SSH_PID=$!
trap "kill $SSH_PID 2>/dev/null; exit" EXIT
# 开始监控
monitor_tunnel $SSH_PID