GoForum › 🌐 V2EX

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

Cola90 · 2026-09-03 16:38 · 0 次点赞 · 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 user@1.2.3.4 \
  "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 内置的对齐:Bash、Read、Write、Edit、Glob、Grep、WebFetch,外加 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/

1 条回复
Maboroshii · 2026-09-03 16:43
#1

我一般跟 agent 说:你用 tmux 开一个 session ,ssh 连接到机器 balabalabala

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: Cola90
发布: 2026-09-03
点赞: 0
回复: 0