## 为什么做这个

最近写代码、改文档、点网页这类事,基本可以交给 AI Agent 了。但一碰到**服务器操作**就经常卡住。

公司环境里,机器往往在跳板机 / 堡垒机后面:菜单登录、OTP、多级跳转……Agent 没法直接 `ssh user@host`。人排查问题时也一样麻烦:先登录,把日志拷到本地,丢给 Agent 分析,再拿着步骤回到线上执行。来回倒腾,又慢又容易出错。

所以做了 **Shellink**:把「多级跳板之后的那台机器」收成一个稳定会话,让 AI Agent(和人)能在上面执行命令、传文件、看历史。

- 仓库(MIT):https://github.com/jie123108/Shellink

- 中文文档:https://github.com/jie123108/Shellink/blob/main/README.zh-CN.md

Agent 经跳板到达目标机、通过 Shellink CLI 干活的演示:

![Agent 经跳板操作目标机](https://raw.githubusercontent.com/jie123108/Shellink/main/docs/screenshots/shellink-agent-jump.gif)

## Shellink 是什么

一句话:面向 AI Agent 和人类的**会话中间件**(session middleware)。

本地跑一个 daemon,持有 SSH / 本地 PTY 会话;外面用统一的 CLI(以及 TUI、Web UI、HTTP/WebSocket)去操作这些会话。不是又一个 SSH GUI,重点是:

- 会话状态可查询(`CONNECTING` / `OUTPUTTING` / `WAITING_INPUT` / `IDLE` / `DISCONNECTED`),方便 Agent 决定下一步

- CLI 有稳定的 `--json` 输出,适合脚本和 Agent 调用

- 需要人插手时可以切到 `MANUAL` 模式(例如输入 OTP)

- 仓库里有 `shellink-cli` skill,Agent 按 CLI 接口操作即可,不必自己实现 SSH/跳板逻辑

Web UI 会话(经跳板到达目标):

![Web UI session](https://raw.githubusercontent.com/jie123108/Shellink/main/docs/screenshots/web-session.png)

## 几个有意思的点

**1. 文件传输走现有 PTY,不要求 SFTP**

多级跳板、expect 登录链路上,往往没有干净的 SFTP/SCP 入口。上传/下载走同一条 PTY,复杂跳板也能把日志拉下来、把脚本推上去——正好对应「拷日志到本地再问 Agent」那个痛点。

**2. 显式会话状态机**

把「命令还在跑 / 在等输入 / 已空闲」暴露成机器可读状态,Agent 可以决定:执行下一条、发输入、等待,还是交给人——而不是靠刮屏幕文字猜。

**3. AUTO / MANUAL 人机协同**

Agent 在 AUTO 下工作;OTP 或敏感操作时人接管终端,做完再交回。会话输入输出留历史,方便审计和回放。

**4. 登录本身留给你熟悉的工具**

说明边界:Shellink **本身不负责自动登录**。多级跳转、堡垒机菜单、OTP 等,建议用 `command` 类型的 profile 挂 [`expect`](https://linux.die.net/man/1/expect) 脚本;简单场景也可以用 `sshpass`(仅密码)或 `ssh` 的 `ProxyJump` / `ProxyCommand`。Shellink 负责把**登录完成后的会话**管起来(执行命令、传文件、状态、审计)。

## 快速试用

安装二进制(macOS / Linux):

```bash

curl -fsSL https://raw.githubusercontent.com/jie123108/Shellink/main/install.sh -o /tmp/shellink-install.sh

cat /tmp/shellink-install.sh # 建议先看一眼再执行

sh /tmp/shellink-install.sh

```

或让 AI 助手按文档安装:

> 请帮我安装 Shellink 及其 skills,参考这份文档:https://raw.githubusercontent.com/jie123108/Shellink/main/AGENTS_INSTALL.md

装好后:

```bash

shellink cli # TUI,会按需拉起 daemon

shellink agent-doc # 给 Agent 看的接口说明

```

最小可跑示例:

```bash

shellink profile create --input - --json <<'JSON'

{"name":"local-shell","connectType":"command","command":"/bin/sh"}

JSON

shellink session create --profile <profile-id> --json

shellink session exec <session-id> --command 'uname -a' --json

shellink session close <session-id> --json

```

Web UI 默认在本地:`http://127.0.0.1:7070/shellink/ui/`

## 技术栈(简要)

TypeScript、Node 22、Fastify、`ssh2`、`node-pty`、SQLite(better-sqlite3 + Drizzle)、MessagePack + Zod、Vue 3 + xterm.js。提供 macOS / Linux 的 Bun 单文件二进制。

## 诚实的局限

- 不替你做登录:多跳 / 菜单 / OTP 是你的 expect(或 ssh / sshpass)脚本;Shellink 管登录之后。

- `command` profile 以 daemon 进程用户身份执行配置的命令,只在受信任环境跑,并保护好 `SHELLINK_TOKEN`。

- 让 Agent 直连生产有真实风险:建议先只读/排查类操作,或指向非生产环境。

- 暂不支持 Windows(目前 macOS / Linux)。

## 想听的反馈

有跳板机 / 堡垒机场景的同学,更想听两件事:

1. 你的登录链路用 `command` + expect 能否覆盖?哪里会断?

2. 接 Cursor / Claude Code 等时,CLI / `--json` / skill 哪里别扭、缺什么?

仓库再次放这里:https://github.com/jie123108/Shellink

欢迎提 issue / PR,也欢迎直接在评论区聊你的跳板环境。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐