最近在折腾远程服务器管理的时候,发现了一个痛点:现在的 AI 模型有了 "大模型上下文协议"(MCP)加持后,确实能帮我们执行不少命令,但市面上的 ssh-mcp-server 大多是 "哑巴" 型——只能跑跑一次性脚本,一旦遇到需要交互的场景,比如 topvim 或者安装软件时的 Are you sure?,直接就卡壳了。

这其实是 MCP 传输机制的限制。标准的 MCP 协议设计初衷是为结构化数据交互服务的,并没有原生的 TTY(终端设备)支持。当你试图通过 MCP 调用 SSH 时,它就像是在后台默默跑命令,既无法接收你的键盘输入,也很难把复杂的、动态刷新的终端界面(TUI)实时渲染回来。

那有没有办法解决?或者有没有更好的替代品?我也翻了一圈,给大家整理了几个思路。

1. 尝试支持 TTY 的 MCP 补全或 Fork 版本

既然官方版不支持,社区里肯定有人动手魔改。目前有一些第三方开发的 MCP Server 尝试引入了伪终端(PTY)支持。这些工具会在服务端模拟一个 tty 设备,将输入输出流通过 MCP 的消息机制 "封装" 起来传输。

Tmate 共享会话界面示意图

通过 tmate 生成的 SSH 字符串实现终端共享

虽然这种方式在延迟上有点难受(毕竟多了一层封装),但对于简单的交互(如安装软件时的 yes/no 确认,或者简单的 htop 查看负载)是够用的。如果你动手能力强,可以找一找那些标明 "Interactive Support" 或 "PTY Enabled" 的 fork 分支。

2. 回归经典:Tmate + Tmux 分屏

既然 MCP 这条路在交互上走得磕磕绊绊,不如换个思路:让 AI 给你指令,你自己操作,或者让 AI 连入一个真正的会话。

这就不得不提 tmate 了。它是一个 tmux 的衍生品,最大的特点是能瞬间生成一个临时 SSH 地址,把当前的终端会话分享出去。

WebSSH 浏览器终端示例

通过浏览器访问的 WebSSH 终端界面

玩法是这样的:

  1. 在你的服务器上安装 tmate。
  2. 运行 tmate,它会给你一个 SSH 连接字符串。
  3. 将这个连接字符串扔给 AI(或者说让支持 MCP 的 Client 通过 SSH 客户端连进去),这样 AI 就拥有了一个真正的、具备完整 TTY 功能的 Shell。

这种方案完美绕过了 MCP 协议的终端限制,体验丝滑,唯一的缺点是你需要手动管理那个会话 ID。

3. 利用 WebSSH 代理

还有一种折中方案,就是在服务器上部署一个轻量级的 WebSSH 服务(比如 ttydgotty)。AI 不直接连 SSH 22 端口,而是通过 HTTP/WebSocket 去访问这个 Web 页面。

这种方式的优势在于 Web 端通常对终端渲染做了很好的优化,交互性很强。你需要做的只是写一个简单的 MCP Client,让 AI 能够 "看" 到网页内容(通过解析 DOM)或者直接通过 WebSocket 发送按键指令。虽然开发门槛稍微高一点,但一旦跑通,扩展性极强。

总结

如果你只是想简单跑个脚本,官方的 ssh-mcp-server 足矣;但如果你需要像操作本地终端一样去调试、去交互,目前的 MCP 生态确实还差点火候。

建议路线图:

  • 急用党: 直接用 tmate 创建共享会话,连进去之后爱怎么操作怎么操作,简单粗暴最有效。
  • 极客党: 关注社区里基于 PTY 开发的增强版 MCP Server,或者自己动手写个 Bridge 把 ttyd 接入 MCP 体系。

期待未来 MCP 标准能原生支持流式终端交互,在那之前,上面的这几个土办法应该是最高效的解法了。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭