Dockerhua / entrypoint_wrapper.sh
zhuhai111's picture
Upload 2 files
7e134a7 verified
#!/bin/bash
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 "$@"