TorqueWrench/ssh_tunnel_auto.sh

82 lines
2.1 KiB
Bash
Raw Normal View History

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