代码最初来源于: https://www.vmss.cn/posts/2025083001/ " 零成本搭建“半永久”Minecraft服务器:一次对云开发平台规则…
curl -o keep_alive.sh https://cnb.cool/kfc50/cnb-webide-keep-alive-shell-script/-/git/raw/main/keep_alive.sh && chmod 777 ./keep_alive.sh && ./keep_alive.sh --token YOUR_TOKEN
本脚本通过 CNB 官方 API (api.cnb.cool) 获取用户正在运行的云原生开发环境,然后直接获取它的 SSH 连接命令,也就是在 https://cnb.cool/u/你的cnb用户名/workspaces 中显示的正在打开的云原生开发:

如图所示,我们取其中的 SSH 命令,如:
ssh cnb-h16-1jn6q484l-001.41130ed1-78b2-40a0-8474-ad8ed15365e1-f68@cnb.space
并定时每 10 秒钟执行一次,保持 SSH 连接活跃,防止云原生开发环境因闲置被自动关闭。
1. 调用 CNB API 获取工作空间列表
GET https://api.cnb.cool/workspace/list?page=1&pageSize=20&slug=用户名/仓库名&status=running&branch=分支名
(branch 参数可选,不传则返回所有分支的运行中工作空间)
2. 提取工作空间的 sn (流水线编号)
3. 调用 CNB API 获取工作空间详情
GET https://api.cnb.cool/用户名/仓库名/-/workspace/detail/{sn}
4. 提取 SSH 连接命令
5. 每 10 秒执行一次 SSH 连接,保持环境活跃
在 CNB 云原生开发环境中,脚本会自动通过 CNB_REPO_SLUG 和 CNB_BRANCH 环境变量获取仓库名和分支,无需手动指定 --repo:
# 下载脚本
curl -o keep_alive.sh https://cnb.cool/kfc50/cnb-webide-keep-alive-shell-script/-/git/raw/main/keep_alive.sh
# 赋予执行权限
chmod 777 ./keep_alive.sh
# 后台运行(替换 YOUR_TOKEN 为你的 CNB API 令牌)
nohup ./keep_alive.sh --token YOUR_TOKEN &
在本地电脑运行时,脚本会自动检测是否处于 CNB 云原生开发环境。如果检测不到 CNB_REPO_SLUG 环境变量,则判定用户环境为本地电脑命令行,此时脚本会通过用户级 token 调用 API 获取所有运行中的工作空间,取最近的一个,这样用户在本地电脑也能自动找到正在运行的云原生开发环境,无需手动填写 组织名/仓库名:
# 自动检测最近运行的工作空间,无需指定 --repo
nohup ./keep_alive.sh --token YOUR_TOKEN &
这样做的好处是:用户不在云原生开发网页 VSCode 时候,不能通过环境变量 CNB_REPO_SLUG 去自动获取其自身的环境,但是可以这样通过用户级 token 获取,就不用手动填写 组织名/仓库名了。因为多数情况用户只在一个云原生开发环境中闷头开发代码,所以这里只取最新的;如果用户需要,仍然可以手动指定 组织名/仓库名。
# 手动指定 --repo 参数
nohup ./keep_alive.sh --token YOUR_TOKEN --repo username/repo &
# 如果不指定 --branch,脚本会自动检测当前 git 分支
nohup ./keep_alive.sh --token YOUR_TOKEN --repo username/repo --branch dev &
| 参数 | 必需 | 说明 |
|---|---|---|
--token YOUR_TOKEN | 是 | CNB API 访问令牌,在 CNB 令牌页面 中创建 |
--repo username/repo | 否 | 仓库名,不提供则自动检测(优先 CNB_REPO_SLUG 环境变量,其次 API 自动检测,最后 git remote) |
--branch branch_name | 否 | 分支名,不提供则自动检测(优先 CNB_BRANCH 环境变量,其次 git branch) |

--token 参数脚本会按以下优先级自动检测分支和仓库名,确保不管启动什么分支都能正确使用:
--repo 命令行参数(最高优先级)CNB_REPO_SLUG 环境变量(CNB 云原生开发环境自带,如 kfc50/cnb-webide-keep-alive-shell-script)git remote -v 解析GET /workspace/list?status=running 获取用户最近运行的工作空间(本地环境使用)--branch 命令行参数(最高优先级)CNB_BRANCH 环境变量(CNB 云原生开发环境自带)git branch --show-current(当前 git 分支)git rev-parse --abbrev-ref HEAD(备用检测)当脚本检测不到 CNB_REPO_SLUG 环境变量时,判定用户环境为本地电脑命令行。此时会调用 https://api.cnb.cool/workspace/list?status=running API(无需 slug 参数),通过用户级 token 获取该用户所有正在运行的工作空间列表,取其中最新的一条记录,获取其 slug(用户名/仓库名)和 branch(分支名),然后用这些信息去调用工作空间详情 API 获取 SSH 命令。
这样做的好处是:
--repo 参数手动指定见仓库中的 keep_alive.sh 文件,或查看上方最新提交记录。