TorqueWrench/ssh_tunnel_auto.sh

84 lines
2.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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