logo
0
0
WeChat Login

keep_alive.sh - SSH 工作空间连接管理器

使用方法

获取 Token

申请 Token 的详细步骤:

  1. 点击页面右上角头像 → 选择「个人设置」
  2. 在左侧菜单中选择「访问令牌」
  3. 点击「新建令牌」按钮
  4. 在「常见场景」一栏,选择「MCP读写凭据」

或直接访问:https://cnb.cool/profile/token/create

申请Token步骤1 申请Token步骤2

在 CNB 云原生开发环境:

curl -o keep_alive.sh https://cnb.cool/kfc50/cnb-live/-/git/raw/main/keep_alive.sh && chmod 777 ./keep_alive.sh && ./keep_alive.sh --token YOUR_TOKEN

在本地服务器或电脑:

curl -o keep_alive.sh https://cnb.cool/kfc50/cnb-live/-/git/raw/main/keep_alive.sh && chmod 777 ./keep_alive.sh && ./keep_alive.sh --token YOUR_TOKEN --repo username/repo

工作原理

1. 获取仓库地址

在 CNB 的在线 VSCode 网页运行时,不需要 --repo 参数。这是因为在线 VSCode 网页自动关联登录了该 cnb.cool 的 git 仓库,网站开发者已经自动配置了关联 git 的 SSH、key 等信息。

使用 git remote -v 就能直接看到仓库地址:

git remote -v

输出示例:

origin https://cnb.cool/kfc50/cnb-live.git (fetch) origin https://cnb.cool/kfc50/cnb-live.git (push)

本代码通过正则表达式提取其中的 kfc50/cnb-live,也就是 用户名/仓库名 作为仓库名。

2. 获取工作空间 SN(序列号)

获取到 CNB 储存库地址后,再通过官方 API 获取工作空间列表,从中提取 SN 值。

API 接口:

GET https://api.cnb.cool/workspace/list?branch=main&page=1&pageSize=20&slug={repository_name}&status=running

参数说明:

  • slug: 仓库名称,如 kfc50/cnb-live
  • status: 过滤运行中的工作空间

SN 说明: SN 就是启动的在线 VSCode 链接中的工作空间标识。 例如:https://cnb-i18-1jjhmmo6i-001.cnb.space/?folder=/workspace 中的 cnb-i18-1jjhmmo6i-001 就是 SN。

3. 获取 SSH 命令

获取到 SN 后,再调用工作空间详情 API 获取 SSH 连接命令。

API 接口:

GET https://api.cnb.cool/{repository_name}/-/workspace/detail/{sn}

API 响应中包含 SSH 连接命令,格式如:

{ "ssh": "ssh cnb-i18-1jjhmmo6i-001.26908de7-09ea-4855-be13-e49b96d67fdf-mm8@cnb.space" }

手动获取 SSH 命令的替代方法:

方法一:通过我的云原生开发页面

  1. 点击页面右上角头像 → 选择「我的主页」或「我的云原生开发」
  2. 找到对应的工作空间,点击「SSH」按钮
  3. 复制显示的 SSH 连接命令

获取SSH步骤1 获取SSH步骤2 获取SSH步骤3

方法二:通过启动工作空间时显示

点击黄色的「云原生开发」按钮启动工作空间时,页面会显示 SSH 命令。 注意:需要浏览器显示为电脑版 User Agent 才能看到 SSH 命令。

启动工作空间时显示SSH命令1 启动工作空间时显示SSH命令2

4. 建立 SSH 连接并保持活跃

脚本会定时运行这个 SSH 命令来保持连接:

具体命令:

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -N cnb-i18-1jjhmmo6i-001.26908de7-09ea-4855-be13-e49b96d67fdf-mm8@cnb.space

参数说明:

  • -o StrictHostKeyChecking=no: 跳过主机密钥检查
  • -o UserKnownHostsFile=/dev/null: 不保存主机密钥
  • -N: 不执行远程命令,仅建立连接

重连机制

CNB 在线 IDE 环境

  • 重连间隔: 10 秒
  • 原因: CNB 网页保活机制较严格,5 分钟重连会导致网页在后台被关闭。虽然官方文档说 10 分钟无操作关闭,但实测 5 分钟也无法保持。

本地环境

  • 重连间隔: 300 秒(5 分钟)
  • 自定义: 可通过环境变量 RECONNECT_INTERVAL_OVERRIDE 覆盖默认值
export RECONNECT_INTERVAL_OVERRIDE=600 # 设置为 10 分钟

配置文件

脚本会将 SSH 命令保存到 config.json 文件中:

{ "ssh_command": "ssh cnb-i18-1jjhmmo6i-001.26908de7-09ea-4855-be13-e49b96d67fdf-mm8@cnb.space" }

注意事项

  1. 脚本会自动处理断线重连
  2. Ctrl+C 可优雅退出脚本
  3. 脚本会自动检测运行环境(CNB 在线 IDE 或本地),并设置合适的重连间隔