摘要

CloudStudio 免费 GPU 容器仅支持网页 IDE 访问,无法直接通过 SSH 远程连接。本文采用 cpolar 内网穿透,将容器 22 端口 SSH 服务暴露至公网,搭配 SSH 密钥免密登录方案,实现 Windows WSL2 终端一键远程登录云端容器,方便本地开发、远程模型训练。同时整理实操过程大量踩坑点,适合新手完整复现。

@TOC

一、环境与痛点介绍

1.1 环境清单

  • 远端:CloudStudio Ubuntu GPU 容器(免费实例)
  • 本地:Windows11 + WSL2 Ubuntu
  • 穿透工具:cpolar(免费版)

1.2 现存痛点

  1. CloudStudio 免费实例闲置一段时间,会被平台自动休眠回收;实例重启后所有进程销毁;
  2. cpolar 免费隧道重启后,公网域名、端口随机变化;
  3. Linux SSH 服务对密钥文件权限严格校验,权限配置错误直接导致免密登录失败;
  4. 网页终端意外关闭,容器内运行的 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

HostNamePort 修改为 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:公钥已经上传,依旧要求输入密码

按顺序排查:

  1. 云端容器是否成功执行两条chmod权限命令;
  2. authorized_keys文件内公钥完整,不存在多余换行、空格;
  3. 使用的公钥是本地 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

排查流程:

  1. 测试容器外网:curl www.baidu.com
  2. 确认 cpolar 绑定账号 Token:sudo cpolar authtoken 你的后台Token
  3. 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 实例重启后,固定操作顺序:

  1. 网页打开 CloudStudio 启动实例;
  2. 进入容器,运行保活脚本;
  3. 创建 tmux 会话,在会话中启动 cpolar tcp 22;
  4. 复制新的公网转发地址;
  5. 更新本地 WSL ~/.ssh/config
  6. 使用 ssh cs 一键远程连接。

六、小结

借助 cpolar 内网穿透 + SSH 密钥免密,摆脱 CloudStudio 只能网页端操作的限制,可以在本地终端自由操作云端 GPU 容器。需要留意免费版两大限制:实例闲置回收、隧道地址动态变化,每次重启实例记得更新 ssh 配置内的域名端口。

更多推荐