Hermes Agent 多机编排实战:用 SSH 远程调度 Claude Code 跨平台开发
简介
在实际工作中,开发环境往往分散在多台机器上:Linux 服务器运行 CI/CD 和 AI 编排工具,Mac 负责前端开发,Windows 负责后端或数据库开发。如果能从一台中央机器统一调度所有开发机上的 AI Coding Agent,就能实现”一个大脑,多双手”的协作模式。
本文介绍如何使用 Hermes Agent 作为中央调度器,通过 SSH 远程调用 Mac 和 Windows 开发机上的 Claude Code,实现跨平台、多机器的 AI 编程任务编排。这套方案已在生产环境中验证,支持同时向多台机器分发任务、监控执行进度、收集执行结果。
前置要求
- 中央调度机:一台 Linux 服务器(Ubuntu/Debian),已安装 Hermes Agent
- 远程开发机:至少一台 Mac(macOS)和/或一台 Windows(10/11 22H2+)
- 远程开发机:已安装 Claude Code(或其他 AI Coding Agent)
- 网络:中央调度机能够 SSH 连接到各远程开发机
- SSH 密钥:已配置免密登录到所有远程开发机
- 基本的 SSH 和命令行使用经验
详细步骤
1. 远程开发机基础环境准备
1.1 Mac 开发机
Mac 通常自带 SSH Server,只需确保已开启:
1 2 3 4 5
| sudo systemsetup -getremotelogin
sudo systemsetup -setremotelogin on
|
安装 Claude Code(如未安装):
1
| npm install -g @anthropic-ai/claude-code
|
1.2 Windows 开发机
Windows 需要安装 OpenSSH Server。以管理员身份打开 PowerShell:
1 2 3 4 5 6 7 8 9
| Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd Set-Service -Name sshd -StartupType 'Automatic'
New-NetFirewallRule -DisplayName 'OpenSSH Server (SSH)' -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
|
安装 Claude Code:
1
| npm install -g @anthropic-ai/claude-code
|
注意:Windows 上 Claude Code 的路径可能包含空格,建议使用完整路径或通过 npx 调用。
1.3 获取各机器 IP 地址
1 2 3 4 5
| ifconfig | grep inet
ipconfig
|
记录每台机器的局域网 IP 地址,例如:
- Mac:
192.168.31.100
- Windows:
192.168.31.200
2. 中央调度机 SSH 配置
2.1 生成密钥对(如已有可跳过)
1
| ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
|
2.2 复制公钥到各远程机器
1 2 3 4 5
| ssh-copy-id user@192.168.31.100
ssh-copy-id windows_user@192.168.31.200
|
2.3 配置 SSH Config 简化连接
编辑 ~/.ssh/config,添加各机器的连接配置:
1 2 3 4 5 6 7 8 9 10 11 12 13
| # Mac 开发机 Host mac-dev HostName 192.168.31.100 User mac_user IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60
# Windows 开发机 Host win-dev HostName 192.168.31.200 User windows_user IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60
|
测试连接:
1 2
| ssh mac-dev "echo 'Mac 连接成功'" ssh win-dev "echo 'Windows 连接成功'"
|
3. 远程执行 Claude Code 基础模式
3.1 单条命令模式
最简单的用法:通过 SSH 传递一条任务给远程 Claude Code。
远程 Mac 执行:
1
| ssh mac-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p '查看当前目录的文件结构' --allowedTools 'Read' --max-turns 5" 2>/dev/null
|
远程 Windows 执行:
1
| ssh win-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p '查看当前目录的文件结构' --allowedTools 'Read' --max-turns 5" 2>/dev/null
|
参数说明:
| 参数 |
作用 |
建议值 |
-p / --print |
直接传入 prompt,非交互模式 |
任务描述文本 |
--allowedTools |
限制 Claude Code 可用的工具 |
'Read,Edit' 或 'Read' |
--max-turns |
最大对话轮次,防止无限循环 |
5-30,视任务复杂度而定 |
2>/dev/null |
过滤掉终端控制字符,只保留有效输出 |
建议始终添加 |
3.2 复杂任务的多轮执行
对于需要多步推理的任务,需要给 Claude Code 足够的轮次:
1 2 3 4 5 6 7 8 9 10 11
| ssh mac-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p ' 请完成以下任务:
1. 在 src/components/ 下创建一个 UserCard.tsx 组件 2. 该组件接收 name、email、avatarUrl 三个 props 3. 使用 Tailwind CSS 进行样式设计 4. 在 src/App.tsx 中引入并使用该组件,传入示例数据 5. 运行 npm run build 确认没有编译错误
完成后请输出所有改动文件的路径和改动摘要。 ' --allowedTools 'Read,Edit,Bash' --max-turns 30" 2>/dev/null
|
3.3 处理编码问题
远程 Windows 执行时,中文或特殊字符可能产生编码问题。解决方案:
1 2 3 4 5 6 7 8 9
| ssh win-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p 'List all files in src/' --allowedTools 'Read' --max-turns 5" 2>/dev/null
cat > /tmp/prompt.txt << 'EOF' 列出 src 目录下所有文件 EOF scp /tmp/prompt.txt win-dev:/path/to/prompt.txt ssh win-dev "type prompt.txt | npx --yes @anthropic-ai/claude-code --allowedTools 'Read' --max-turns 5" 2>/dev/null
|
4. 使用 tmux 管理远程会话(Windows 篇)
Windows 原生不支持 screen 或 tmux,但可以通过 tmux-windows(基于 Win32 的 tmux 移植)来管理长时间运行的 Claude Code 会话。
4.1 安装 tmux-windows
1 2
| ssh win-dev "winget install arndawg.tmux-windows"
|
安装后,tmux 可执行文件路径类似:
1
| C:\Users\user\AppData\Local\Microsoft\WinGet\Packages\arndawg.tmux-windows_Microsoft.Winget.Source_8wekyb3d8bbwe\tmux.exe
|
4.2 创建和管理会话
1 2 3 4 5 6 7 8
| ssh win-dev "start /B tmux.exe new-session -d -s dev-task 'npx --yes @anthropic-ai/claude-code'"
ssh win-dev "tmux.exe send-keys -t dev-task '请分析 src/ 目录的结构' Enter"
ssh win-dev "tmux.exe capture-pane -t dev-task -p -S -30"
|
4.3 完整的远程任务工作流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ssh win-dev "tmux.exe new-session -d -s dbview-dev 'npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 30'"
ssh win-dev "tmux.exe send-keys -t dbview-dev '请完成以下重构任务...' Enter"
sleep 120
ssh win-dev "tmux.exe capture-pane -t dbview-dev -p -S -50"
ssh win-dev "tmux.exe send-keys -t dbview-dev '继续下一个任务' Enter"
ssh win-dev "tmux.exe kill-session -t dbview-dev"
|
5. 多机并行任务编排
5.1 同时向 Mac 和 Windows 分发任务
1 2 3 4 5 6 7 8 9 10
| ssh mac-dev "cd /path/to/frontend && npx --yes @anthropic-ai/claude-code -p '修复登录页面的样式问题' --allowedTools 'Read,Edit' --max-turns 20" 2>/dev/null &
ssh win-dev "cd /path/to/backend && npx --yes @anthropic-ai/claude-code -p '修复用户查询接口的分页问题' --allowedTools 'Read,Edit' --max-turns 20" 2>/dev/null &
wait
echo "两台机器的任务都已执行完毕"
|
5.2 使用 Hermes Agent 的 delegate_task 编排
在 Hermes Agent 中,可以通过 delegate_task 将任务分发给子代理,每个子代理负责 SSH 到一台远程机器执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from hermes_tools import terminal import json
tasks = [ { "name": "前端修复", "target": "mac-dev", "workdir": "/path/to/frontend", "prompt": "修复登录页面的样式问题,确保移动端适配", "max_turns": 20 }, { "name": "后端修复", "target": "win-dev", "workdir": "/path/to/backend", "prompt": "修复用户查询接口的分页问题,添加单元测试", "max_turns": 25 } ]
results = [] for task in tasks: print(f"分发任务: {task['name']} -> {task['target']}") cmd = f'ssh {task["target"]} "cd {task["workdir"]} && npx --yes @anthropic-ai/claude-code -p \'{task["prompt"]}\' --allowedTools \'Read,Edit,Bash\' --max-turns {task["max_turns"]}" 2>/dev/null' result = terminal(cmd, timeout=600) results.append({"task": task["name"], "output": result["output"][-500:], "exit_code": result["exit_code"]})
print(json.dumps(results, ensure_ascii=False, indent=2))
|
5.3 任务依赖编排
当任务之间有依赖关系时(如后端 API 完成后前端才能对接),需要按顺序执行:
1 2 3 4 5 6 7 8 9 10 11
| echo "=== 阶段 1:后端 API 开发 ===" ssh win-dev "cd /path/to/backend && npx --yes @anthropic-ai/claude-code -p '实现订单查询 API,包括数据库查询和接口返回' --allowedTools 'Read,Edit,Bash' --max-turns 30" 2>/dev/null
echo "=== 阶段 2:前端页面开发 ===" ssh mac-dev "cd /path/to/frontend && npx --yes @anthropic-ai/claude-code -p '对接订单查询 API,实现订单列表页面' --allowedTools 'Read,Edit,Bash' --max-turns 30" 2>/dev/null
echo "=== 阶段 3:集成测试 ===" ssh win-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p '运行集成测试,确保前后端联调正常' --allowedTools 'Read,Bash' --max-turns 15" 2>/dev/null
|
6. 结果收集与状态监控
6.1 捕获并解析 Claude Code 输出
Claude Code 的 -p 模式输出包含结构化信息,可以通过 grep/sed 提取关键内容:
1 2 3 4 5 6 7 8
| ssh mac-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p '修复登录页的 CSS 问题' --allowedTools 'Read,Edit' --max-turns 15" 2>/dev/null | tee /tmp/task_result.log
grep -E "^(Edited|Created|Deleted|Modified)" /tmp/task_result.log || echo "未检测到文件改动"
grep -E "(PASS|FAIL|Error|error)" /tmp/task_result.log || echo "未检测到测试输出"
|
6.2 长时间任务的状态轮询
对于需要数分钟的任务,使用 tmux 会话 + 轮询模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ssh win-dev "tmux.exe new-session -d -s long-task 'npx --yes @anthropic-ai/claude-code -p \"重构数据库访问层\" --allowedTools Read,Edit,Bash --max-turns 50'"
for i in $(seq 1 12); do echo "=== 第 ${i} 次检查 ===" output=$(ssh win-dev "tmux.exe capture-pane -t long-task -p -S -20" 2>/dev/null) echo "$output"
if echo "$output" | grep -q "✦"; then echo "任务完成!" break fi
sleep 30 done
ssh win-dev "tmux.exe capture-pane -t long-task -p -S -80" 2>/dev/null
ssh win-dev "tmux.exe kill-session -t long-task" 2>/dev/null
|
7. 安全最佳实践
7.1 使用专用部署密钥
1 2 3 4
| ssh-keygen -t ed25519 -f ~/.ssh/id_remote_dev -C "remote-dev-deploy" ssh-copy-id -i ~/.ssh/id_remote_dev.pub mac-dev ssh-copy-id -i ~/.ssh/id_remote_dev.pub win-dev
|
7.2 限制 SSH 允许的命令
在远程机器的 ~/.ssh/authorized_keys 中,可以为特定密钥添加命令限制:
1
| command="npx --yes @anthropic-ai/claude-code" ssh-ed25519 AAA... remote-dev-deploy
|
这样该密钥只能用于执行 Claude Code,无法执行任意命令。
7.3 使用 SSH 配置文件管理多环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Host mac-prod HostName 192.168.31.100 User developer IdentityFile ~/.ssh/id_remote_dev ServerAliveInterval 30 ServerAliveCountMax 3
Host mac-staging HostName 192.168.31.101 User developer IdentityFile ~/.ssh/id_remote_dev ServerAliveInterval 30
Host win-prod HostName 192.168.31.200 User developer IdentityFile ~/.ssh/id_remote_dev ServerAliveInterval 30
|
代码示例
完整的多机任务调度脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #!/usr/bin/env bash set -euo pipefail
MAC_HOST="mac-dev" MAC_PROJECT="/Users/user/projects/frontend" WIN_HOST="win-dev" WIN_PROJECT="/path/to/backend" TMUX_PATH="tmux.exe"
GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m'
echo -e "${BLUE}=== 多机任务调度开始 ===${NC}"
echo -e "${GREEN}[1/2] 分发前端任务到 Mac...${NC}" ssh "$MAC_HOST" "cd $MAC_PROJECT && npx --yes @anthropic-ai/claude-code -p '修复登录页面在移动端的样式问题' --allowedTools 'Read,Edit' --max-turns 20" 2>/dev/null & PID_MAC=$!
echo -e "${GREEN}[2/2] 分发后端任务到 Windows...${NC}" ssh "$WIN_HOST" "cd $WIN_PROJECT && npx --yes @anthropic-ai/claude-code -p 'Fix pagination bug in user query API' --allowedTools 'Read,Edit,Bash' --max-turns 25" 2>/dev/null & PID_WIN=$!
echo -e "${BLUE}等待任务完成...${NC}" wait $PID_MAC echo -e "${GREEN}Mac 任务完成${NC}" wait $PID_WIN echo -e "${GREEN}Windows 任务完成${NC}"
echo -e "${BLUE}=== 多机任务调度结束 ===${NC}"
|
使用 tmux 管理 Windows 会话的封装函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| tmux_win() { local action="$1" local session="$2" shift 2 ssh win-dev "tmux.exe $action -t $session $*" 2>/dev/null }
tmux_win_create() { local session="$1" local workdir="$2" ssh win-dev "start /B tmux.exe new-session -d -s $session 'cd $workdir && npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 30'" 2>/dev/null }
tmux_win_send() { local session="$1" local prompt="$2" ssh win-dev "tmux.exe send-keys -t $session '$prompt' Enter" 2>/dev/null }
tmux_win_capture() { local session="$1" local lines="${2:-30}" ssh win-dev "tmux.exe capture-pane -t $session -p -S -$lines" 2>/dev/null }
tmux_win_create "api-task" "/path/to/project" sleep 5 tmux_win_send "api-task" "请实现用户列表 API,包含分页和搜索功能" sleep 120 tmux_win_capture "api-task" 50
|
常见问题
1. SSH 连接超时或断开怎么办?
配置 ServerAliveInterval 和 ServerAliveCountMax 保持连接活跃:
1 2 3 4
| Host * ServerAliveInterval 60 ServerAliveCountMax 3
|
对于长时间任务,建议使用 tmux 或 nohup 确保任务不会因 SSH 断开而终止。
2. Windows 上 Claude Code 执行时中文乱码?
Windows 终端默认编码为 GBK,而 Claude Code 输出 UTF-8。解决方案:
- 使用英文 prompt(推荐)
- 或在 PowerShell 中先执行
chcp 65001 切换到 UTF-8
- 或通过
2>/dev/null 过滤控制字符
3. 远程执行时如何传递复杂 prompt?
复杂 prompt 包含引号、换行等特殊字符时,建议:
- 将 prompt 写入远程机器的文件,然后通过 stdin 传入
- 使用 heredoc 语法
- 或使用 base64 编码传输
1 2 3
| PROMPT_B64=$(echo "复杂 prompt 内容" | base64 -w0) ssh mac-dev "echo '$PROMPT_B64' | base64 -d | npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit --max-turns 20" 2>/dev/null
|
4. 如何确认远程 Claude Code 正在执行?
- 使用
ps 或 tasklist 检查进程是否存在
- 对于 tmux 会话,使用
capture-pane 查看实时输出
- 检查远程机器上的日志文件或临时输出文件
5. 多个任务同时执行会不会冲突?
只要每个任务操作不同的项目目录或不同的分支,就不会冲突。建议:
- 每个任务使用独立的项目副本或 Git worktree
- 每个 tmux 会话使用不同的会话名
- 后端和前端任务天然不冲突(不同目录、不同技术栈)
6. 远程执行时网络中断,任务会丢失吗?
- 使用
npx claude-code -p 单次模式:如果 SSH 中断,Claude Code 进程也会终止,任务丢失
- 使用 tmux 会话:即使 SSH 断开,tmux 中的 Claude Code 会继续运行,重连后可以 attach 查看
- 建议关键任务始终使用 tmux 或 screen 包装
7. Mac 和 Windows 的路径格式不同,如何处理?
在脚本中根据目标主机动态处理路径:
1 2 3 4
| case "$host" in mac-*) cmd="cd /Users/user/project && npx ..." ;; win-*) cmd="cd /path/to/project && npx ..." ;; esac
|
8. 如何限制 Claude Code 在远程机器上的资源使用?
在远程机器的 Claude Code 配置中设置:
1 2 3 4 5 6
| { "maxTokens": 4096, "maxTurns": 30, "timeout": 300000 }
|
同时可以在 SSH 命令中使用 timeout 命令限制总执行时间:
1
| ssh mac-dev "timeout 300 npx --yes @anthropic-ai/claude-code -p '...' --max-turns 20" 2>/dev/null
|
小结
本文介绍了如何用 Hermes Agent 作为中央调度器,通过 SSH 远程调用 Mac 和 Windows 开发机上的 Claude Code,实现跨平台多机 AI 编程任务编排。核心要点:
- 基础通道:SSH 免密登录 + Config 配置
- 远程执行:
npx claude-code -p 单次模式适合简单任务
- 会话管理:Windows 使用 tmux-windows 管理长时间运行的任务
- 并行编排:Shell 后台任务 + wait 实现多机并行
- 任务依赖:按阶段串行执行,确保依赖关系正确
- 结果收集:捕获输出、轮询状态、解析结果
这套方案让一台 Linux 服务器能够统一调度 Mac 和 Windows 上的 AI 编程能力,充分发挥各平台的开发优势。