Hermes Agent 多机编排实战:用 SSH 远程调度 Claude Code 跨平台开发

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
# 在 Mac 上检查远程登录是否开启
sudo systemsetup -getremotelogin

# 如果返回 "Remote Login: Off",则开启
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
# 安装 OpenSSH Server
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
# Mac
ifconfig | grep inet

# Windows (PowerShell)
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
# 复制到 Mac
ssh-copy-id user@192.168.31.100

# 复制到 Windows
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
# 方案一:使用英文 prompt(推荐)
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

# 方案二:将 prompt 写入文件再传输
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 原生不支持 screentmux,但可以通过 tmux-windows(基于 Win32 的 tmux 移植)来管理长时间运行的 Claude Code 会话。

4.1 安装 tmux-windows

1
2
# 在 Windows 上通过 winget 安装
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
# 创建名为 "dev-task" 的 tmux 会话,启动 Claude Code
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
# 步骤 1:创建新会话
ssh win-dev "tmux.exe new-session -d -s dbview-dev 'npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 30'"

# 步骤 2:发送任务 prompt
ssh win-dev "tmux.exe send-keys -t dbview-dev '请完成以下重构任务...' Enter"

# 步骤 3:等待执行(例如 120 秒)
sleep 120

# 步骤 4:捕获输出查看进度
ssh win-dev "tmux.exe capture-pane -t dbview-dev -p -S -50"

# 步骤 5:如需要继续发送指令
ssh win-dev "tmux.exe send-keys -t dbview-dev '继续下一个任务' Enter"

# 步骤 6:完成后关闭会话
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
# 在 Mac 上执行前端任务
ssh mac-dev "cd /path/to/frontend && npx --yes @anthropic-ai/claude-code -p '修复登录页面的样式问题' --allowedTools 'Read,Edit' --max-turns 20" 2>/dev/null &

# 在 Windows 上执行后端任务
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
# 阶段 1:后端先执行
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

# 阶段 2:前端对接(依赖后端 API 定义)
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

# 阶段 3:集成测试
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
# 启动任务(在 Windows 上)
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"

# 检查是否完成(Claude Code 完成时会显示提示符)
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
# ~/.ssh/config 多环境配置
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}"

# 任务 1:Mac 前端任务
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=$!

# 任务 2:Windows 后端任务
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 操作函数
tmux_win() {
local action="$1"
local session="$2"
shift 2
ssh win-dev "tmux.exe $action -t $session $*" 2>/dev/null
}

# 创建会话并启动 Claude Code
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 连接超时或断开怎么办?

配置 ServerAliveIntervalServerAliveCountMax 保持连接活跃:

1
2
3
4
# 在 ~/.ssh/config 中添加
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
# 使用 base64 编码传输
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 正在执行?

  • 使用 pstasklist 检查进程是否存在
  • 对于 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
// ~/.claude/settings.json
{
"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 编程任务编排。核心要点:

  1. 基础通道:SSH 免密登录 + Config 配置
  2. 远程执行npx claude-code -p 单次模式适合简单任务
  3. 会话管理:Windows 使用 tmux-windows 管理长时间运行的任务
  4. 并行编排:Shell 后台任务 + wait 实现多机并行
  5. 任务依赖:按阶段串行执行,确保依赖关系正确
  6. 结果收集:捕获输出、轮询状态、解析结果

这套方案让一台 Linux 服务器能够统一调度 Mac 和 Windows 上的 AI 编程能力,充分发挥各平台的开发优势。