让脚本和 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。
  • 默认先做只读检查。 涉及安装、删除、重启服务、改配置、写文件时,应该先跟用户说清楚影响再动手。

还没连上第一台机器?看使用教程 →