让本地 Agent 接管远程 Linux :别让模型套 SSH(daimon-mcp)

Cola90 2026-09-03 16:37 1

让本地 Agent 接管 VPS:别让模型套 SSH ( processd-mcp 、daimon-mcp )


买了台 Debian 小鸡,想让 Claude Code / Codex 直接把 Docker 、nginx 配好。
最省事的想法是:本地 Agent 每条命令前面套一层 ssh user@vps "..."
跑了两天,发现不是「偶尔转义错」,是这条路会系统性把模型用废。


让模型套 SSH ,有两件结构性的事


1. 二次编码,命令更容易写错


Agent 真正想执行的是这一条:


grep -E "error|fail" /var/log/nginx/error.log | tail -20

套上 SSH 之后,它得生成类似:


ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no -p 22 [email protected] \
"grep -E \"error|fail\" /var/log/nginx/error.log | tail -20"

这里发生了两次编码:



  • 本地 shell 先解析整行 ssh ... "inner"

  • 远端 shell 再解析 inner


引号、管道、$VAR`、反引号、换行,每一层都要逃一次。`$OLD 这种在本地就被展开了,根本到不了远端;复杂一点的 sed、heredoc 、json 片段,错位一次整条废。
模型训练时见过的是「干净命令」,不是「 SSH 包装后的二次转义」。它会把意图写对,再在包装层写错。


2. Bash 会话不保持,同样的活要多绕几轮


SSH 默认是无状态的:这次 cd /workspace && source .venv/bin/activate,下一次 tool call 又是全新 shell ,$PWD 回到 home ,venv 、export 、后台进程全没了。


于是模型被迫每一步都把状态塞回命令里,或者先 pwd、再 cd、再确认 venv 、再跑真正要做的那步。你在看的「 Agent 在干活」,有很大一部分是在恢复上一跳丢掉的环境。


ControlMaster 只能复用 TCP ,救不了远程 shell 的 cwd 和环境变量——模型每次生成的仍是一条独立的 ssh ... "cmd"


这两件事叠在一起



  1. 二次编码影响模型的命令准确性。 失败经常不是「它不知道该装 Docker 」,而是包装层把引号、变量、管道编坏了。排错也更难:你看到的报错混着 SSH 参数、本地展开和远端执行,模型自己也不知道是哪一层炸的,容易改错地方。

  2. Bash 不保持,模型需要更多轮 loop 才能完成相同操作。 本来 3 步能做完的( cd 、改配置、重启),变成 8 步:确认目录、再 cd 、确认环境、再执行、失败、检查是不是没 cd 、再来一次。token 和时间都耗在状态对齐上,不是耗在任务本身。


所以问题不是「模型不够聪明」,是运输层在跟它作对。


我做了什么


VPS 上只跑一个静态 musl 的 processd-mcp(对外也叫 daimon-mcp ),暴露的工具和 Claude Code 内置的对齐:BashReadWriteEditGlobGrepWebFetch,外加 PTY 。


本地 Agent 继续在你电脑上跑( Claude Code / Codex CLI / Codex 桌面 GUI / Cursor 都行)。远端不装模型、不装 Codex 。Agent 生成的就是那条干净命令,由 processd-mcp 在同一个 shell 会话里执行——cwd 、环境变量、后台任务会保持下去,没有 SSH 那层二次编码。


生产走 Tailscale ,别 0.0.0.0:8080 裸奔。


你怎么装


Debian / Ubuntu + systemd ,SSH 上去一次:


curl -fsSL https://github.com/daimon-hq/release/releases/latest/download/install-processd-kernel.sh | sudo bash -s -- install

sudo systemctl status processd-mcp --no-pager
curl -i http://127.0.0.1:8080/health # 204
sudo awk -F= '/^PROCESSD_TOKEN=/{print $2}' /etc/processd-mcp/processd-mcp.env

默认绑 127.0.0.1,本地 Agent 连不上远程回环。改成 Tailscale IP 再重启:


TS_IP=$(tailscale ip -4)
sudo sed -i "s/^MCP_HOST=.*/MCP_HOST=${TS_IP}/" /etc/processd-mcp/processd-mcp.env
sudo systemctl restart processd-mcp

本地 .mcp.json


{
"mcpServers": {
"daimon": {
"type": "http",
"url": "http://<Tailscale IP>:8080/mcp",
"headers": {
"X-Access-Token": "<PROCESSD_TOKEN>"
}
}
}
}

然后直接说:「把这台机器装好 Docker ,起一个 nginx 监听 80 。」


安装资产: https://github.com/daimon-hq/release
文档: https://daimon-hq.github.io/

最新回复 (10)
  • Maboroshii 09-03 16:39
    1
    我一般跟 agent 说:你用 tmux 开一个 session ,ssh 连接到机器 balabalabala
  • laurent 09-03 18:53
    2
    和楼上差不多,手动开 tmux ssh 连上服务器。然后告诉 agent 连上刚才 session 进行操作。如果命令要 sudo ,输完命令后,等待 30s ,我来手动输入。
  • binhb 09-03 20:29
    3
    这个场景目前在使用 warp terminal 来解决
  • phrack 09-03 20:52
    4
    简单问题复杂化
  • Cola90 楼主 09-03 20:56
    5
    @phrack 你猜生产沙箱要怎么做? ssh 吗?
  • phrack 09-03 21:14
    6
    你把 AI 带偏了

    AI 会顺着你的话说,它能力也强,你想要什么都能给你搞出来。一个领域你不熟悉,跟 AI 做东西出来就是这种奇怪的东西,有点像是以前说的,拿着 python 写 c 代码的样子,写出来能用,但是怎么看都不顺眼

    ---

    你这篇文章实在是太过 AI ,我就不引用了,AI 口水话看的多了都知道哪些是 AI 的口水,站长不让发 AI 内容的

    ---

    工具的话,如果只是一次性或者用个几次的,让它本地写好脚本,scp 上去执行就行了,哪里不对改脚本,不会涉及到编码的问题

    生产用的一般 ansible 配置,让 AI 写 ansible ,稳定容错高

    生产直接云上起 k8s cluster 也多了,没有配置 docker nginx 这些东西的过程了,都在 k8s 里,AI 写 k8s resource 也很强,让它写 resource yaml ,最多再加几个脚本弄个简单的 template

    你应该是没怎么接触过服务器管理,想当然的脑袋里面有个思路,反正 AI 什么都能做,做出来就是这个样子
  • Cola90 楼主 09-03 21:22
    7
    @phrack 你应该是不是做 ai 行业的吧,你没明白我在说啥
  • phrack 09-03 21:33
    8
    @Cola90 前面写那么长我也没明白你给我整个简单版的吧

    是要给 AI 一个交互式 shell 吗?但是这个只是手段,目的还是配置服务器?
  • codelover2016 09-04 10:50
    9
    ( 你为什么不在上面跑个 DeepSeek Harness ,用 ds-harness-remote 试试呢?~~~
  • Cola90 楼主 09-04 11:23
    10
    我就不逐个解释了,这是个 AI Agent Sandbox Kernel 。并不是用于传统意义的运维。有兴趣可以了解下。
* 帖子来源V2EX
返回