买了台 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"
这里发生了两次编码:
引号、管道、$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]
[/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/

