阅读时间 • 3 分钟
VSCode 的 SSH Agent 简直离谱
作者:Thomas Ptacek(@tqbf)
我们有兴趣融入到 VSCode 通过 SSH 进行远程编辑的工作流中,因为现在所有人都在用 VSCode,而且尤其是,大家用的还是那些能借助 LLM 生成代码的 VSCode 分支版本。
LLM 把代码写错时,我们称之为“幻觉”(hallucination);人把代码写错时,我们称之为“工程”(engineering)。
如果你清楚自己在做什么,LLM 生成的代码在一般场景下是有用的。但如果你能在 LLM 与执行环境之间形成闭环(也就是所谓的“Agent”配置),它的用处会大得多。关于这一点有很多可说的,但眼下先提一句:这是对抗幻觉的一种半有效解药:LLM 生成代码,Agent 脚手架运行代码,代码产生报错,Agent 再把报错反馈给 LLM,如此往复迭代。
所以,很显然,问题在于你并不希望这种迭代式开发过程发生在你的开发笔记本上,因为 LLM 存在边界感问题,它们会像在你手头的 Git 项目里那样,兴高采烈地反复折腾你的系统配置。你真正希望做到的事情是:在一台能瞬时启动、干干净净、无论如何都坑不到你的 Linux 实例上,为 LLM 跑一套闭环的 Agent 式(“agentic”?现在都这么叫了吗)配置。你应该明白我们要说什么了吧。
总之!我想郑重提出一点担忧。
Emacs 上孕育着远程编辑系统的精神鼻祖——一大坨超好用的 Elisp,名叫“Tramp”。只要你能把 Tramp 接到任何一种可交互环境上——通常是一个 SSH 会话——只要那里能运行 Bourne shell 命令,它就能把 Emacs 的能力延伸到那个环境。
那么,VSCode 也有一个类似 Tramp 的功能。挺妙的,对吧?你大概会想:不就是照着 Tramp 来,稍微简化一点,把 Elisp 换成 TypeScript 嘛。
但与那种在远程连接上“就地取材”的 Tramp 不同,VSCode 搞了一场全面入侵:它会运行一段充当 stager 的 Bash 代码片段,用来下载一个 agent,其中还包括一份二进制形式的 Node 安装。
这个 agent 通过做了端口转发的 SSH 运行。它会建立一条 WebSocket 连接,连回你正在运行的 VSCode 前端。这条连接上的底层协议可以: