set -e # 如果任何命令失败,则立即退出 | |
# --- 配置 SSH 隧道 --- | |
REMOTE_USER="abcuser" | |
REMOTE_HOST="www.ip188.net" | |
REMOTE_SSH_PORT="30002" | |
REMOTE_FORWARD_PORT="15900" # 远程服务器 (www.ip188.net) 上要监听的端口 | |
LOCAL_PORT="5900" # 容器内部要暴露的端口 (VNC 默认端口) | |
PASSWORD="abc123456" # SSH 密码 (强烈建议使用 SSH 密钥代替!) | |
# --- 配置结束 --- | |
echo "正在启动 SSH 隧道 (后台)..." | |
echo "远程转发: ${REMOTE_HOST}:${REMOTE_FORWARD_PORT} -> 容器 localhost:${LOCAL_PORT}" | |
# 导出密码供 sshpass 使用 | |
export SSHPASS="${PASSWORD}" | |
# 设置 AUTOSSH 环境变量 | |
# AUTOSSH_GATETIME=0: 防止 autossh 在首次连接失败时立即退出 | |
# AUTOSSH_POLL=60: 每 60 秒检查一次连接状态 (可选) | |
export AUTOSSH_GATETIME=0 | |
# export AUTOSSH_POLL=60 | |
# 使用 autossh 启动 SSH 隧道 | |
# -M 0: 不使用监控端口,依靠 SSH 进程的退出状态来检测连接失败 | |
# -f: autossh 在成功建立连接和认证后转入后台运行 | |
# -N: SSH 选项 - 不执行远程命令,仅用于端口转发 | |
# -R: SSH 选项 - 远程端口转发 (Server to Client) | |
# -o StrictHostKeyChecking=no: 首次连接时不提示确认主机密钥 (生产环境不推荐) | |
# -o UserKnownHostsFile=/dev/null: 不使用 known_hosts 文件 (生产环境不推荐) | |
# -o ServerAliveInterval=30: 每 30 秒发送一次心跳以保持连接 | |
# -o ServerAliveCountMax=3: 允许 3 次心跳无响应后断开 | |
# -o ExitOnForwardFailure=yes: 如果端口转发设置失败则退出 | |
# sshpass -e: 使用 SSHPASS 环境变量中的密码 | |
autossh -M 0 -f \ | |
-o "ServerAliveInterval=30" \ | |
-o "ServerAliveCountMax=3" \ | |
-o "StrictHostKeyChecking=no" \ | |
-o "UserKnownHostsFile=/dev/null" \ | |
-o "ExitOnForwardFailure=yes" \ | |
sshpass -e ssh \ | |
-N \ | |
-R ${REMOTE_FORWARD_PORT}:localhost:${LOCAL_PORT} \ | |
-p ${REMOTE_SSH_PORT} \ | |
${REMOTE_USER}@${REMOTE_HOST} | |
echo "SSH 隧道启动命令已发出。等待几秒钟..." | |
sleep 5 # 等待一下,让隧道有机会建立或失败 | |
echo "隧道设置尝试完成。现在执行容器的原始命令..." | |
# 执行传递给此脚本的任何命令 (即 Dockerfile 中的 CMD) | |
exec "$@" |