让脚本和 AI 复用已经连好的通道
MyShell 可以在本机开一个只监听 127.0.0.1 的小接口。本机的脚本、或者你正在用的 AI 助手,可以借用你已经认证好的 SSH 通道去执行命令——而拿不到你的密码和私钥。默认关闭。
它解决什么
想让 AI 助手看一眼服务器日志,通常得把密码或私钥交给它。
有了本地接口,你自己在 MyShell 里连好服务器,本机程序只在这条已连好的通道上执行命令,拿不到凭据。用一次性密码或双因素认证的机器也能用。
安全边界
- 只听本机。 绑定 127.0.0.1,局域网和公网都到不了。
- 每个请求都要钥匙。 钥匙写在一个只有当前 macOS 用户能读的文件里,可以设成每次启动重新生成。
- 拒绝浏览器。 带
Origin头的请求一律拒掉,避免网页脚本借你的浏览器调它。 - 不接受凭据。 建连接口只认已保存连接的编号;请求体里夹带密码、私钥、口令会被直接拒绝。要改认证信息只能回软件里改。
- 不吐凭据。 返回的通道列表和接口说明里没有任何密文字段。
- 默认是关的。不用的时候就让它关着——这个接口能在你所有已连通道上执行命令,这是它的能力上限,也是风险上限。
打开它
设置 → 本机入口 → 打开。页面上会显示当前地址、运行信息文件的路径,以及一段可以直接粘到终端跑的 cURL 示例。
开启后 MyShell 会写一个运行信息文件(local-api.json),里面有地址和当前钥匙。调用方应该读这个文件拿地址,不要把端口写死——首选端口被占用时软件会换一个。
关掉入口或退出软件,这个文件会被删除,排队中的命令会被取消。
准备调用环境
钥匙只放在当前进程的变量里,不要 echo 出来,也不要写进脚本或 shell 历史。
INFO="$HOME/Library/Application Support/uk.flyooo.myshell/local-api.json"
BASE_URL="$(jq -r '.baseUrl' "$INFO")"
TOKEN="$(jq -r '.token' "$INFO")"
接口
第一个请求应该是 GET /v1,它会返回当前版本支持的全部接口、参数、限制和错误码——调用方可以据此决定后续怎么调,不用照着文档硬编码。
GET /v1— 接口自述:所有路由、参数、返回格式、错误码。不含钥匙。GET /v1/health— 服务是否在跑。不代表有可用通道。GET /v1/connections— 软件里已保存、可建立的 SSH 连接。不含任何凭据字段。GET /v1/hubs— 当前活着的通道:名称、地址、用户、系统、shell、繁忙程度。POST /v1/hubs/connect— 按已保存连接的编号建一条无终端后台通道。已有可用通道时直接复用。POST /v1/hubs/exec— 在指定通道上执行命令,拿回标准输出、错误输出、退出码、耗时。POST /v1/hubs/exec-by-name— 同上,但按通道名称找;名称必须唯一。POST /v1/hubs/keep-open— 让通道在没有终端时继续保持。POST /v1/hubs/close— 主动关闭一条通道。
几个例子
看看有哪些通道 — 先确认有没有现成的连接可用。
curl --fail --silent --show-error \
--header "Authorization: Bearer $TOKEN" \
"$BASE_URL/v1/hubs" | jq在某条通道上跑一条命令 — 参数全部走 JSON 请求体,通道名里有中文也不用自己转码。
BODY="$(jq -nc --arg hubId "$HUB_ID" --arg command "uptime" \
'{hubId: $hubId, command: $command, timeoutMs: 30000}')"
curl --fail --silent --show-error --request POST \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \
--data-binary "$BODY" \
"$BASE_URL/v1/hubs/exec" | jq按已保存的连接建一条后台通道 — 请求体只接受连接编号。夹带密码或私钥会被拒绝。
BODY="$(jq -nc --arg connectionId "$ID" '{connectionId: $connectionId}')"
curl --fail --silent --show-error --request POST \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type: application/json' \
--data-binary "$BODY" \
"$BASE_URL/v1/hubs/connect" | jq
调用时要注意的
- 收到 200 不等于命令成功。 要同时看 HTTP 状态、返回里的
status和exitCode。命令自己失败(比如exit 1)也会是 200。 - 输出不一定是文本。 远端输出不是有效 UTF-8 时会按 Base64 返回并标明编码,展示前要先检查编码字段。
- 每条通道最多排 32 条命令。 满了返回 429,应该稍后重试而不是高频重发。
- 请求体上限 64 KiB,单条命令上限 16 KiB。
- 默认先做只读检查。 涉及安装、删除、重启服务、改配置、写文件时,应该先跟用户说清楚影响再动手。