Windows 远程开发环境进阶:tmux 会话管理 + Claude Code 自动化

Windows 远程开发环境进阶:tmux 会话管理 + Claude Code 自动化

简介

在跨平台开发中,Windows 作为后端或数据库开发的主力平台,经常需要远程调用其上的 AI 编程工具。然而 Windows 原生缺乏 Linux 风格的终端复用工具(如 tmux、screen),导致长时间运行的 AI Agent 任务在 SSH 断开后容易丢失。

本文介绍如何在 Windows 上搭建完整的远程开发环境,包括 tmux-windows 会话管理、Claude Code 自动化执行、任务编排和错误恢复机制。这套方案已在生产环境中稳定运行,支持通过 SSH 从 Linux 远程调度 Windows 上的 AI 编程任务。

前置要求

  • Windows 10/11(22H2 及以上版本)
  • 已安装 OpenSSH Server(见基础 SSH 教程)
  • 已安装 Node.js(推荐 v18 LTS 或更高)
  • 已安装 Claude Code 或其他 AI Coding Agent
  • 管理员权限(安装部分工具需要)
  • 基本的 PowerShell 和命令行使用经验

详细步骤

1. Windows 开发环境初始化

1.1 安装必要工具

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装 Git
winget install Git.Git

# 安装 Node.js LTS
winget install OpenJS.NodeJS.LTS

# 安装 Claude Code
npm install -g @anthropic-ai/claude-code

# 验证安装
node --version
npm --version
npx --yes @anthropic-ai/claude-code --version

1.2 配置 PowerShell 执行策略

允许运行本地脚本:

1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

1.3 配置环境变量

1
2
3
4
5
6
# 将 npm 全局包路径加入 PATH
[Environment]::SetEnvironmentVariable(
"Path",
[Environment]::GetEnvironmentVariable("Path", "User") + ";$env:APPDATA\npm",
"User"
)

2. 安装和配置 tmux-windows

2.1 通过 winget 安装

1
winget install arndawg.tmux-windows

安装后,tmux 可执行文件位于类似以下路径:

1
2
C:\Users\<用户名>\AppData\Local\Microsoft\WinGet\Packages\
arndawg.tmux-windows_Microsoft.Winget.Source_8wekyb3d8bbwe\tmux.exe

2.2 创建 tmux 配置文件

在用户目录下创建 .tmux.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ~/.tmux.conf
# 设置前缀键为 Ctrl+A(避免与 Windows 快捷键冲突)
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# 启用鼠标支持
set -g mouse on

# 增加滚动缓冲区
set -g history-limit 50000

# 状态栏配置
set -g status-bg colour235
set -g status-fg white
set -g status-left '#[fg=green]#S '
set -g status-right '#[fg=yellow]%Y-%m-%d %H:%M'

2.3 创建辅助脚本

为了方便从 Linux 远程调用,在 Windows 上创建封装脚本 C:\scripts\tmux-claude.ps1

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
param(
[Parameter(Mandatory=$true)]
[string]$SessionName,

[Parameter(Mandatory=$true)]
[string]$WorkDir,

[Parameter(Mandatory=$true)]
[string]$Prompt,

[int]$MaxTurns = 30
)

$TmuxPath = "$env:LOCALAPPDATA\Microsoft\WinGet\Packages\arndawg.tmux-windows_Microsoft.Winget.Source_8wekyb3d8bbwe\tmux.exe"

# 创建新的 tmux 会话
$InitCmd = "cd $WorkDir && npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns $MaxTurns"
Start-Process -NoNewWindow -FilePath $TmuxPath -ArgumentList "new-session", "-d", "-s", $SessionName, $InitCmd

# 等待会话启动
Start-Sleep -Seconds 5

# 发送 prompt
& $TmuxPath send-keys -t $SessionName $Prompt Enter

Write-Output "Session '$SessionName' created. Prompt sent."

3. tmux 会话生命周期管理

3.1 创建会话

1
2
# 从 Linux 远程创建会话
ssh win-dev "tmux.exe new-session -d -s api-dev 'npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 30'"

3.2 发送任务

1
2
# 发送 prompt 到指定会话
ssh win-dev "tmux.exe send-keys -t api-dev '请实现用户管理模块的 CRUD 接口' Enter"

3.3 查看会话列表

1
ssh win-dev "tmux.exe list-sessions"

预期输出:

1
2
api-dev: 1 windows (created Fri Jun 12 10:00:00 2026)
db-task: 1 windows (created Fri Jun 12 09:30:00 2026)

3.4 捕获会话输出

1
2
3
4
5
# 捕获最近 30 行
ssh win-dev "tmux.exe capture-pane -t api-dev -p -S -30"

# 捕获全部输出(可能很大)
ssh win-dev "tmux.exe capture-pane -t api-dev -p -S -"

3.5 发送中断信号

如果 Claude Code 卡住或需要中断当前操作:

1
2
3
4
5
6
7
8
# 发送 Ctrl+C
ssh win-dev "tmux.exe send-keys -t api-dev C-c"

# 等待进程响应
sleep 3

# 发送新的指令
ssh win-dev "tmux.exe send-keys -t api-dev '请重新开始,这次注意不要陷入循环' Enter"

3.6 关闭会话

1
ssh win-dev "tmux.exe kill-session -t api-dev"

4. Claude Code 自动化执行模式

4.1 单次执行模式(-p 参数)

适合简单、明确的任务:

1
ssh win-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p '运行所有测试并输出结果' --allowedTools 'Read,Bash' --max-turns 10" 2>/dev/null

优点:简单直接,执行完自动退出
缺点:SSH 断开则任务终止,不适合长时间任务

4.2 交互式会话模式(tmux 包装)

适合复杂、多步骤的任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 步骤 1:创建会话
ssh win-dev "tmux.exe new-session -d -s refactor-task 'npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 50'"

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

# 步骤 3:等待并检查进度
sleep 60
ssh win-dev "tmux.exe capture-pane -t refactor-task -p -S -30"

# 步骤 4:如果完成,发送退出指令
ssh win-dev "tmux.exe send-keys -t refactor-task '/exit' Enter"
sleep 5

# 步骤 5:获取最终输出
ssh win-dev "tmux.exe capture-pane -t refactor-task -p -S -100"

# 步骤 6:清理
ssh win-dev "tmux.exe kill-session -t refactor-task"

4.3 批量任务队列模式

适合需要依次执行多个子任务的情况:

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
36
37
#!/usr/bin/env bash
# 批量任务队列执行脚本
set -euo pipefail

TMUX="tmux.exe"
SESSION="batch-queue"
WORKDIR="/path/to/project"

# 创建会话
ssh win-dev "$TMUX new-session -d -s $SESSION 'cd $WORKDIR && npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 80'"
sleep 5

# 任务队列
TASKS=(
"任务 1:在 src/models/ 下创建 User 模型,包含 id、name、email、createdAt 字段"
"任务 2:在 src/routes/ 下创建用户 CRUD 路由"
"任务 3:在 tests/ 下为用户 API 编写单元测试"
"任务 4:运行 npm test 确认所有测试通过"
)

for i in "${!TASKS[@]}"; do
echo "=== 执行任务 $((i+1))/${#TASKS[@]} ==="
ssh win-dev "$TMUX send-keys -t $SESSION '${TASKS[$i]}' Enter"

# 等待任务完成(根据复杂度调整等待时间)
sleep 120

# 检查进度
ssh win-dev "$TMUX capture-pane -t $SESSION -p -S -20"
echo "---"
done

# 获取最终结果
ssh win-dev "$TMUX capture-pane -t $SESSION -p -S -100"

# 清理
ssh win-dev "$TMUX kill-session -t $SESSION"

5. 错误处理与恢复机制

5.1 检测 Claude Code 是否卡住

1
2
3
4
5
6
7
8
9
10
11
# 检查最后输出是否长时间未变化
LAST_OUTPUT=$(ssh win-dev "tmux.exe capture-pane -t my-session -p -S -5" 2>/dev/null)
sleep 30
CURRENT_OUTPUT=$(ssh win-dev "tmux.exe capture-pane -t my-session -p -S -5" 2>/dev/null)

if [ "$LAST_OUTPUT" = "$CURRENT_OUTPUT" ]; then
echo "任务可能卡住,发送中断信号..."
ssh win-dev "tmux.exe send-keys -t my-session C-c"
sleep 5
ssh win-dev "tmux.exe send-keys -t my-session '请继续,如果遇到问题请简化方案' Enter"
fi

5.2 自动重试机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env bash
# 带自动重试的任务执行
MAX_RETRIES=3
RETRY_DELAY=30

for attempt in $(seq 1 $MAX_RETRIES); do
echo "尝试 $attempt/$MAX_RETRIES..."

# 执行任务
ssh win-dev "cd /path/to/project && npx --yes @anthropic-ai/claude-code -p '修复 CI 构建失败的问题' --allowedTools 'Read,Edit,Bash' --max-turns 20" 2>/dev/null

EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "任务成功"
break
else
echo "任务失败(退出码: $EXIT_CODE)"
if [ $attempt -lt $MAX_RETRIES ]; then
echo "等待 ${RETRY_DELAY}s 后重试..."
sleep $RETRY_DELAY
fi
fi
done

5.3 超时控制

1
2
3
4
5
6
# 使用 timeout 命令限制总执行时间
ssh win-dev "timeout 300 bash -c 'cd /path/to/project && npx --yes @anthropic-ai/claude-code -p \"修复所有 lint 错误\" --allowedTools Read,Edit,Bash --max-turns 30'" 2>/dev/null

if [ $? -eq 124 ]; then
echo "任务超时(300 秒)"
fi

6. 多会话并行管理

6.1 同时运行多个独立任务

1
2
3
4
5
6
7
8
9
10
11
# 会话 1:API 开发
ssh win-dev "tmux.exe new-session -d -s api-task 'cd /path/to/project/api && npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 30'"
ssh win-dev "tmux.exe send-keys -t api-task '实现订单 API' Enter"

# 会话 2:数据库迁移
ssh win-dev "tmux.exe new-session -d -s db-task 'cd /path/to/project/db && npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 20'"
ssh win-dev "tmux.exe send-keys -t db-task '编写数据库迁移脚本' Enter"

# 会话 3:测试编写
ssh win-dev "tmux.exe new-session -d -s test-task 'cd /path/to/project/tests && npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 25'"
ssh win-dev "tmux.exe send-keys -t test-task '为订单模块编写测试' Enter"

6.2 统一状态检查

1
2
3
4
5
6
# 检查所有会话状态
for session in api-task db-task test-task; do
echo "=== $session ==="
ssh win-dev "tmux.exe capture-pane -t $session -p -S -5" 2>/dev/null || echo "会话不存在"
echo ""
done

7. 日志记录与审计

7.1 启用 tmux 日志

1
2
3
4
5
# 创建会话时启用日志
ssh win-dev "tmux.exe new-session -d -s logged-task 'npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns 30'"

# 启用管道日志
ssh win-dev "tmux.exe pipe-pane -t logged-task -o 'C:\logs\claude-task-%Y-%m-%d.log'"

7.2 任务完成后自动保存日志

1
2
3
4
5
# 捕获完整输出并保存到文件
ssh win-dev "tmux.exe capture-pane -t my-task -p -S -" > /tmp/claude_output_$(date +%Y%m%d_%H%M%S).log

# 提取关键信息
grep -E "(Edited|Created|Error|PASS|FAIL)" /tmp/claude_output_*.log

代码示例

完整的 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env bash
# windows-remote-manager.sh — 从 Linux 管理 Windows 远程开发环境
set -euo pipefail

WIN_HOST="win-dev"
TMUX="tmux.exe"

# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

usage() {
echo "用法: $0 <command> [args]"
echo ""
echo "命令:"
echo " create <session> <workdir> [max_turns] 创建新会话"
echo " send <session> <prompt> 发送任务"
echo " watch <session> [lines] 查看输出"
echo " list 列出所有会话"
echo " kill <session> 关闭会话"
echo " exec <workdir> <prompt> 单次执行(非交互)"
echo " status 检查环境状态"
}

cmd_status() {
echo -e "${YELLOW}=== Windows 开发环境状态 ===${NC}"

echo -n "Node.js: "
ssh "$WIN_HOST" "node --version" 2>/dev/null || echo "未安装"

echo -n "npm: "
ssh "$WIN_HOST" "npm --version" 2>/dev/null || echo "未安装"

echo -n "Claude Code: "
ssh "$WIN_HOST" "npx --yes @anthropic-ai/claude-code --version" 2>/dev/null || echo "未安装"

echo -n "tmux: "
ssh "$WIN_HOST" "test -f $TMUX && echo '已安装' || echo '未安装'" 2>/dev/null

echo -e "\n${YELLOW}活跃会话:${NC}"
ssh "$WIN_HOST" "$TMUX list-sessions" 2>/dev/null || echo "无活跃会话"
}

cmd_create() {
local session="$1"
local workdir="$2"
local max_turns="${3:-30}"

echo -e "${GREEN}创建会话 '$session' (工作目录: $workdir, max_turns: $max_turns)${NC}"
ssh "$WIN_HOST" "$TMUX new-session -d -s $session 'cd $workdir && npx --yes @anthropic-ai/claude-code --allowedTools Read,Edit,Bash --max-turns $max_turns'" 2>/dev/null
sleep 3
echo "会话已创建"
}

cmd_send() {
local session="$1"
shift
local prompt="$*"

echo -e "${GREEN}发送任务到 '$session':${NC}"
echo "$prompt"
ssh "$WIN_HOST" "$TMUX send-keys -t $session '$prompt' Enter" 2>/dev/null
echo "任务已发送"
}

cmd_watch() {
local session="$1"
local lines="${2:-30}"

echo -e "${YELLOW}=== 会话 '$session' 输出 (最近 $lines 行) ===${NC}"
ssh "$WIN_HOST" "$TMUX capture-pane -t $session -p -S -$lines" 2>/dev/null || echo "会话不存在"
}

cmd_list() {
echo -e "${YELLOW}=== 活跃会话 ===${NC}"
ssh "$WIN_HOST" "$TMUX list-sessions" 2>/dev/null || echo "无活跃会话"
}

cmd_kill() {
local session="$1"
echo -e "${RED}关闭会话 '$session'${NC}"
ssh "$WIN_HOST" "$TMUX kill-session -t $session" 2>/dev/null && echo "已关闭" || echo "会话不存在"
}

cmd_exec() {
local workdir="$1"
shift
local prompt="$*"

echo -e "${GREEN}单次执行 (工作目录: $workdir)${NC}"
ssh "$WIN_HOST" "cd $workdir && npx --yes @anthropic-ai/claude-code -p '$prompt' --allowedTools 'Read,Edit,Bash' --max-turns 20" 2>/dev/null
}

# 主入口
case "${1:-help}" in
create) cmd_create "${2:?缺少 session 名称}" "${3:?缺少工作目录}" "${4:-}" ;;
send) cmd_send "${2:?缺少 session 名称}" "${*:3}" ;;
watch) cmd_watch "${2:?缺少 session 名称}" "${3:-}" ;;
list) cmd_list ;;
kill) cmd_kill "${2:?缺少 session 名称}" ;;
exec) cmd_exec "${2:?缺少工作目录}" "${*:3}" ;;
status) cmd_status ;;
*) usage ;;
esac

PowerShell 辅助脚本(Windows 端)

在 Windows 上保存为 C:\scripts\remote-dev.ps1

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
36
37
38
39
40
41
42
43
44
45
# remote-dev.ps1 — Windows 端远程开发辅助脚本
param(
[Parameter(Position=0)]
[ValidateSet("status", "session", "cleanup")]
[string]$Command = "status"
)

$TmuxPath = "$env:LOCALAPPDATA\Microsoft\WinGet\Packages\arndawg.tmux-windows_Microsoft.Winget.Source_8wekyb3d8bbwe\tmux.exe"

switch ($Command) {
"status" {
Write-Host "=== 开发环境状态 ===" -ForegroundColor Yellow
Write-Host "Node: $(node --version)"
Write-Host "npm: $(npm --version)"
Write-Host "Claude Code: $(npx --yes @anthropic-ai/claude-code --version 2>`$null)"
Write-Host "tmux: $(if (Test-Path $TmuxPath) { '已安装' } else { '未安装' })"

Write-Host "`n=== tmux 会话 ===" -ForegroundColor Yellow
& $TmuxPath list-sessions 2>$null
if ($LASTEXITCODE -ne 0) { Write-Host "无活跃会话" }
}

"session" {
$sessions = & $TmuxPath list-sessions 2>$null
if ($LASTEXITCODE -eq 0) {
Write-Host "活跃会话:" -ForegroundColor Green
$sessions
} else {
Write-Host "无活跃会话" -ForegroundColor Yellow
}
}

"cleanup" {
Write-Host "清理所有 tmux 会话..." -ForegroundColor Yellow
$sessions = & $TmuxPath list-sessions 2>$null
if ($LASTEXITCODE -eq 0) {
$sessions | ForEach-Object {
$name = ($_ -split ':')[0]
& $TmuxPath kill-session -t $name
Write-Host " 已关闭: $name" -ForegroundColor Red
}
}
Write-Host "清理完成" -ForegroundColor Green
}
}

常见问题

1. tmux-windows 和 WSL 中的 tmux 有什么区别?

对比项 tmux-windows WSL tmux
运行环境 原生 Windows WSL 子系统
可访问 Windows 文件 直接访问 需通过 /mnt/c/
可执行 Windows 程序 原生支持 需通过 wsl.exe 间接调用
安装复杂度 简单(winget) 需先安装 WSL
性能 原生 有虚拟化开销
Claude Code 兼容性 直接运行 但路径映射复杂

推荐使用 tmux-windows,因为它直接运行在 Windows 上,无需 WSL 层,路径处理更简单。

2. tmux 会话意外退出怎么办?

1
2
3
4
5
6
7
8
# 检查退出原因
ssh win-dev "tmux.exe capture-pane -t my-session -p -S -100" 2>/dev/null

# 如果会话已死,查看 tmux 日志
ssh win-dev "type C:\Users\user\tmux.log" 2>/dev/null

# 重新创建会话
ssh win-dev "tmux.exe new-session -d -s my-session 'npx --yes @anthropic-ai/claude-code'"

3. Claude Code 在 Windows 上运行缓慢?

可能原因和优化方案:

  • 防病毒软件扫描:将项目目录添加到排除列表
  • npm 安装慢:使用 --registry=https://registry.npmmirror.com
  • 内存不足:关闭不必要的程序,确保 Claude Code 有足够内存
  • 磁盘 I/O:使用 SSD,避免在机械硬盘上运行

4. 如何同时监控多个 tmux 会话?

1
2
3
4
5
6
# 轮询多个会话
for session in api-task db-task test-task; do
echo "=== $session ==="
ssh win-dev "tmux.exe capture-pane -t $session -p -S -10" 2>/dev/null
echo ""
done

5. 发送的 prompt 包含特殊字符导致执行失败?

使用文件传递方式避免转义问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 将 prompt 写入临时文件
cat > /tmp/prompt.txt << 'PROMPT_EOF'
请完成以下任务:
1. 创建 User 模型
2. 创建 CRUD 路由
3. 编写测试
PROMPT_EOF

# 传输到 Windows
scp /tmp/prompt.txt win-dev:/path/to/prompt.txt

# 通过文件传递
ssh win-dev "type prompt.txt | tmux.exe send-keys -t my-session -"

6. 如何在 Windows 上调试 Claude Code 的远程执行?

1
2
3
4
5
# 在 Windows 上直接运行(不通过 SSH),查看原始输出
npx --yes @anthropic-ai/claude-code -p "简单测试" --allowedTools Read --max-turns 3

# 查看 Claude Code 日志
type %APPDATA%\Claude\logs\*.log

7. 多个 SSH 连接同时操作同一个 tmux 会话会冲突吗?

不会。tmux 允许多个客户端连接到同一个会话,所有客户端看到的内容同步。但建议避免同时发送冲突的指令。

8. 如何让 tmux 会话在 Windows 重启后自动恢复?

创建一个计划任务:

1
2
3
4
# 创建开机启动任务
$Action = New-ScheduledTaskAction -Execute "C:\path\to\tmux.exe" -Argument "new-session -d -s auto-task 'npx --yes @anthropic-ai/claude-code'"
$Trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "ClaudeCodeAutoSession" -Action $Action -Trigger $Trigger -RunLevel Highest

小结

本文详细介绍了如何在 Windows 上搭建远程开发环境,核心是使用 tmux-windows 管理 Claude Code 会话,实现:

  1. 会话持久化:SSH 断开后任务继续运行
  2. 远程控制:从 Linux 发送指令、查看输出、中断任务
  3. 批量编排:多会话并行执行不同任务
  4. 错误恢复:自动检测卡住、超时控制和重试机制
  5. 日志审计:完整记录所有执行过程

这套方案将 Windows 打造成一个可靠的远程 AI 编程节点,能够与 Linux 调度中心无缝配合,实现跨平台 AI 编程工作流。