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

查看 39|回复 5
作者:Cola90   
让本地 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"。
    这两件事叠在一起
    [ol]
  • 二次编码影响模型的命令准确性。 失败经常不是「它不知道该装 Docker 」,而是包装层把引号、变量、管道编坏了。排错也更难:你看到的报错混着 SSH 参数、本地展开和远端执行,模型自己也不知道是哪一层炸的,容易改错地方。
  • Bash 不保持,模型需要更多轮 loop 才能完成相同操作。 本来 3 步能做完的( cd 、改配置、重启),变成 8 步:确认目录、再 cd 、确认环境、再执行、失败、检查是不是没 cd 、再来一次。token 和时间都耗在状态对齐上,不是耗在任务本身。
    [/ol]
    所以问题不是「模型不够聪明」,是运输层在跟它作对。
    我做了什么
    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://:8080/mcp",
          "headers": {
            "X-Access-Token": ""
          }
        }
      }
    }
    然后直接说:「把这台机器装好 Docker ,起一个 nginx 监听 80 。」
    安装资产: https://github.com/daimon-hq/release
    文档: https://daimon-hq.github.io/

    Agent, 远程, 会话

  • Maboroshii   
    我一般跟 agent 说:你用 tmux 开一个 session ,ssh 连接到机器 balabalabala
    laurent   
    和楼上差不多,手动开 tmux ssh 连上服务器。然后告诉 agent 连上刚才 session 进行操作。如果命令要 sudo ,输完命令后,等待 30s ,我来手动输入。
    binhb   
    这个场景目前在使用 warp terminal 来解决
    phrack   
    简单问题复杂化
    Cola90
    OP
      
    @phrack 你猜生产沙箱要怎么做? ssh 吗?
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部