CloudStudio + cpolar 内网穿透实现外网 SSH 免密远程连接 GPU 容器
摘要
CloudStudio 免费 GPU 容器仅支持网页 IDE 访问,无法直接通过 SSH 远程连接。本文采用 cpolar 内网穿透,将容器 22 端口 SSH 服务暴露至公网,搭配 SSH 密钥免密登录方案,实现 Windows WSL2 终端一键远程登录云端容器,方便本地开发、远程模型训练。同时整理实操过程大量踩坑点,适合新手完整复现。
@TOC
一、环境与痛点介绍
1.1 环境清单
- 远端:CloudStudio Ubuntu GPU 容器(免费实例)
- 本地:Windows11 + WSL2 Ubuntu
- 穿透工具:cpolar(免费版)
1.2 现存痛点
- CloudStudio 免费实例闲置一段时间,会被平台自动休眠回收;实例重启后所有进程销毁;
- cpolar 免费隧道重启后,公网域名、端口随机变化;
- Linux SSH 服务对密钥文件权限严格校验,权限配置错误直接导致免密登录失败;
- 网页终端意外关闭,容器内运行的 cpolar 进程容易被终止。
1.3 实现目标
本地终端输入简短命令 ssh cs,无需输入长地址、密码,一键外网登录 CloudStudio 云端 GPU 容器。
二、完整分步实操教程
2.1 本地 WSL 生成 SSH 密钥对【本地终端执行】
生成 4096 位 RSA 密钥,全程回车,不要设置密钥密码,实现无密码登录。
bash
ssh-keygen -t rsa -b 4096
执行完成,查看公钥内容(完整复制,后续需要使用)
bash
cat ~/.ssh/id_rsa.pub
输出内容以
ssh-rsa开头,末尾为本机标识,妥善保存。
2.2 CloudStudio 容器启动 cpolar 穿透隧道【云端容器执行】
推荐使用tmux后台运行 cpolar,避免网页终端关闭杀死进程。
bash
# 创建tmux独立会话
tmux new -s cpolar
在弹出的 tmux 窗口内启动 TCP 隧道,映射 SSH 默认 22 端口:
bash
cpolar tcp 22
等待状态切换为 online,复制打印的转发地址: tcp://xxx.tcp.cpolar.top:端口号 -> tcp://127.0.0.1:22
tmux 常用操作:
Ctrl+B松开,再按下D:后台挂起会话tmux a -t cpolar:重新恢复会话窗口
2.3 本地测试密码登录远端容器【本地 WSL 执行】
将域名、端口替换成 cpolar 输出的最新地址
bash
ssh -p 端口号 lili@xxx.tcp.cpolar.top
首次连接输入yes确认主机指纹,输入容器登录密码,验证通道连通。
2.4 云端容器写入公钥,配置免密认证【云端容器内执行】
将双引号内文本替换为第一步复制的完整
id_rsa.pub公钥
bash
mkdir -p ~/.ssh
echo "ssh-rsa XXXXX 本地用户名@主机名" > ~/.ssh/authorized_keys
# Linux SSH硬性权限要求,两条命令必须执行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
执行完毕,输入exit退出服务器,回到本地 WSL 终端。
2.5 本地 WSL 创建 SSH 快捷配置文件【本地终端执行】
⚠️不推荐 vim 手动粘贴,极易引入不可见乱码字符导致配置报错,使用下面命令一键生成纯净配置:
bash
rm -f ~/.ssh/config
cat > ~/.ssh/config << 'EOF'
Host cs
HostName xxx.tcp.cpolar.top
Port 端口号
User lili
ServerAliveInterval 30
ServerAliveCountMax 3
EOF
# 设置配置文件权限
chmod 600 ~/.ssh/config
参数说明: ServerAliveInterval 开启心跳保活,减少长时间闲置 SSH 通道断开。
2.6 一键免密登录测试
bash
ssh cs
✅ 无需输入密码,直接进入云端容器,整套部署完成!
三、高频踩坑汇总(重点收藏)
🚫坑 1:ssh: Connection refused
现象:连接目标端口被拒绝 原因:CloudStudio 实例休眠重启,cpolar 隧道失效,旧域名端口作废。 解决方案:容器内重启 cpolar 获取新地址,同步修改本地~/.ssh/config中的域名、端口。
补充实操:实例重启后快速更新 SSH 配置
CloudStudio 重启后 cpolar 会生成全新转发地址,需要同步修改本地 WSL 的 ssh 配置文件:
bash
nano ~/.ssh/config将
HostName和Port修改为 cpolar 新输出的域名与端口。 nano 操作快捷键:Ctrl+O保存 → 回车确认 →Ctrl+X退出。不想手动编辑,可以直接执行下面命令一键覆盖(记得替换为最新地址):
bash
rm -f ~/.ssh/config cat > ~/.ssh/config << 'EOF' Host cs HostName 新域名 Port 新端口 User lili ServerAliveInterval 30 ServerAliveCountMax 3 EOF chmod 600 ~/.ssh/config修改完成执行
ssh cs测试连通。
🚫坑 2:config line 1: no argument after keyword
现象:ssh 配置文件存在非法字符 原因:Vim 粘贴内容带入终端颜色控制乱码。 解决方案:放弃手动 vim 粘贴,使用cat > ~/.ssh/config命令自动生成配置文件。
🚫坑 3:公钥已经上传,依旧要求输入密码
按顺序排查:
- 云端容器是否成功执行两条
chmod权限命令; authorized_keys文件内公钥完整,不存在多余换行、空格;- 使用的公钥是本地 WSL 生成的
id_rsa.pub,复制内容无误。
🚫坑 4:CloudStudio 免费实例自动休眠断开
平台底层策略,无法彻底关闭闲置检测。 缓解方案(容器内运行后台保活脚本模拟活跃):
bash
cat > keep_alive.sh << 'EOF'
while true
do
curl -s https://www.baidu.com > /dev/null
sleep 300
done
EOF
chmod +x keep_alive.sh
nohup ./keep_alive.sh > alive.log 2>&1 &
提示:仅能延长存活时长,无法保证永久不被平台回收。
🚫坑 5:cpolar 状态长时间 connecting,无法 online
排查流程:
- 测试容器外网:
curl www.baidu.com; - 确认 cpolar 绑定账号 Token:
sudo cpolar authtoken 你的后台Token; Ctrl+C终止进程,多次重试启动隧道。
🚫坑 6:WSL 和 Windows PowerShell SSH 环境互不通用
WSL 内部的密钥、配置仅在 WSL 环境生效; Windows 原生 PowerShell 配置路径:C:\Users\Windows用户名\.ssh,两套环境独立,需要分别配置。
四、拓展实用命令
4.1 本地 ↔ 云端文件互传(免密后直接使用)
bash
# 上传本地文件到云端服务器
scp 本地文件路径 cs:~/
# 下载云端文件到本地
scp cs:~/云端文件路径 ./
4.2 tmux 会话常用命令
bash
tmux new -s cpolar # 创建独立会话
tmux a -t cpolar # 恢复断开的会话
Ctrl+B 再按 D # 后台挂起当前会话
五、标准化日常工作流程(避坑习惯)
每次 CloudStudio 实例重启后,固定操作顺序:
- 网页打开 CloudStudio 启动实例;
- 进入容器,运行保活脚本;
- 创建 tmux 会话,在会话中启动
cpolar tcp 22; - 复制新的公网转发地址;
- 更新本地 WSL
~/.ssh/config; - 使用
ssh cs一键远程连接。
六、小结
借助 cpolar 内网穿透 + SSH 密钥免密,摆脱 CloudStudio 只能网页端操作的限制,可以在本地终端自由操作云端 GPU 容器。需要留意免费版两大限制:实例闲置回收、隧道地址动态变化,每次重启实例记得更新 ssh 配置内的域名端口。
更多推荐
所有评论(0)