2026-02-04 11:35:09 +08:00
|
|
|
|
#!/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
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-02-26 16:39:29 +08:00
|
|
|
|
|
|
|
|
|
|
|