
最近一个月我把自己日常的开发主战场彻底迁到了 Windows WSL 这套组合上又把 tmux 和 Claude Code 前后串起来形成了现在的远程开发工作流。这篇文章不聊概念就把我实际搭这套环境时踩过的坑、验证过的配置、以及最后沉淀下来的操作习惯全部摊开来讲。先说清楚这套方案能解决什么问题你在 Windows 上开发但代码实际跑在 Linux本地 WSL 或远程服务器上所有终端操作都通过 SSH 或 WSL 直接完成。开发过程中会同时打开多个终端窗口、跑多个服务一旦网络波动或 Windows 重启所有会话就全断了。tmux 负责把这些会话全部保活Claude Code 负责把枯燥的重复性命令行操作变成人机对话。两者组合之后的实际体验是我可以随时合上笔记本走人第二天打开屏幕所有终端状态原样恢复并且可以直接用自然语言让 Claude Code 帮我处理编译报错、写测试用例、批量改文件。整套方案尤其适合这几类人需要在 Windows 和 Linux 两种环境之间切换的后端开发者、经常要 ssh 登录远程服务器做部署和运维的工程师、以及已经在用 Claude Code 但还没解决“会话断连”和“多任务并行”这两个痛点的 AI 编程重度用户。1. 整体方案设计为什么是 tmux Claude Code而不是其他组合1.1 Windows 远程开发的痛点到底在哪很多人觉得在 Windows 上做 Linux 开发很难受但真正难受的不是编辑器不好用而是“终端会话管理”这件事在 Windows 上被严重低估了。你在本地开一个 PowerShell 窗口跑开发服务器去干别的事过一会儿窗口被关了、电脑睡眠了、或者 SSH 连远程服务器时网络抖了一下整个进程就没了。更要命的是如果你同时需要操作多个远程目录、看多个日志、跑多个构建任务Windows 自带的终端管理能力几乎是零全靠你开多个窗口去硬扛。我最初试过直接用 Windows Terminal 开多个标签页配合ssh命令登录远程服务器。这种方式看起来很直观但实际用起来问题很明显第一个问题标签页一多你很难记住每个标签页在干什么第二个问题只要你断网哪怕一秒钟那个 SSH 标签页里的 bash 会话直接死掉里面跑着的构建任务、日志输出全部清零第三个问题当你需要在多个服务器之间来回切换时每台机器的会话状态都是孤立的无法统一保存和恢复。这三个痛点叠加在一起远程开发的体验就会被拖垮一半。tmux 解决的正是会话保活和场景还原这两个问题。它本身是一个运行在 Linux 系统上的终端复用器在服务器端替你维护会话、窗口和窗格你本地客户端断开后会话继续运行下次连接直接重新 attach 回去。1.2 为什么选 Claude Code 作为自动化层而不是纯脚本自动化方面我也认真考虑过写 shell 脚本把编译、部署、日志抓取这些操作全部固化成脚本。但实际操作一段时间后发现脚本适合解决“固定不变”的流程而开发工作里大量动作是“每次都有点不一样”的。比如“启动服务后检查日志里有没有上报异常”“改完配置文件后跑一下相关测试并总结覆盖率变化”这些事情每次要调整的参数和观察点都不同写脚本的维护成本远大于收益。Claude Code 是 Anthropic 官方出品的命令行 AI 编程工具可以直接跑在 Linux 环境里读取项目文件、执行命令、修改代码、跑测试。它和 tmux 组合后的逻辑就变成了tmux 保活终端的“身体”Claude Code 充当终端的“大脑”。你只需要在一个 tmux 窗口里启动 Claude Code让它在当前项目里帮你完成一系列操作即使任务耗时长也不怕断连因为 tmux 会一直保活。重新连接后你甚至可以直接看到 Claude Code 的输出历史继续上一轮对话。1.3 这套方案的最终形态和运行流程先把这套环境的最终形态说清楚方便你对照自己当前的情况判断差距Windows 11 系统安装 WSL2Ubuntu 22.04 发行版Windows Terminal 作为本地终端入口可以一键进入 WSLWSL 内安装 tmux、zsh、Node.js 环境Claude Code 以 npm 全局包方式安装在 WSL Linux 环境中项目代码放在 WSL 的文件系统里避免跨文件系统 I/O 损耗日常工作流打开 Windows Terminal → 进入 WSL → 执行tmux attach或新建会话 → 在指定窗口启动 Claude Code → 正常开发和自动化。整个过程看起来平平无奇但每一个环节都有值得展开讲的细节。下面从安装配置开始把完整细节一步步拆开。2. 环境搭建从零配置 WSL、tmux 与 SSH 链接2.1 安装 WSL 并用对 Windows 的版本其实 WSL 的安装早就很简单了管理员身份打开 PowerShell 执行一条命令wsl --install这条命令默认会装 WSL2 并选择 Ubuntu 最新 LTS 版本装完重启电脑即可。但有几个细节值得强调第一确保 Windows 系统版本不要太老Win10 19041 以上或者 Win11 才行否则 WSL 默认是 WSL1性能和功能差异巨大第二WSL 默认安装位置在 C 盘如果你 C 盘空间紧张建议把整个发行版迁移到 D 盘迁移方法我后面会写第三装完之后在 WSL 里更新软件源和基础工具sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git curl wget tmux zsh unzip这里多说一句为什么要用 WSL2 而不是 VMware 或者 VirtualBox 虚拟机。WSL2 底层用的是真正的 Hyper-V 虚拟化技术Linux 内核是独立运行的性能和原生几乎无差别。但它和 Windows 的集成做得比传统虚拟机好太多你可以直接通过wsl命令进入 Linux也可以在 Windows Terminal 里一键打开多个 WSL 标签页还能在 Windows 文件管理器里直接访问 Linux 文件系统。对远程开发来说这种底层是虚拟机、体验是原生的方式是最舒服的。2.2 让 tmux 真正配合你工作的初始化配置tmux 刚装好的默认体验很粗糙需要配置美化才能作为日常主力工具。在 WSL 里执行tmux new -s main进入 tmux 默认会话后把前缀键从Ctrlb改成Ctrla。这个改动看起来无所谓但实际体验差别很大Ctrlb在 bash 里是左移光标的意思你已经习惯按它了如果 tmux 占用在 Shell 里按Ctrlb会直接触发 tmux 指令而不是原行为容易误操作。改成Ctrla后就完全避开了冲突。配置写在~/.tmux.conf文件里我贴一份适合远程开发场景的基础配置set -g prefix C-a unbind C-b bind C-a send-prefix # 开启鼠标支持方便直接用鼠标切窗格、滚动历史 set -g mouse on # 设置历史滚动行数 set -g history-limit 50000 # 使用更直观的窗口列表样式 set -g base-index 1 setw -g pane-base-index 1 # 状态栏显示当前会话、窗口、系统负载 set -g status-left #S set -g status-right #(cut -d -f 1-3 /proc/loadavg) %H:%M这里重点解释history-limit参数。开发时经常需要回看大量日志输出tmux 默认只保存 2000 行很容易把旧日志冲掉。设置成 50000 行后配合鼠标滚轮就能轻松回溯较长时间的终端输出日志分析体验会有质的提升。改完配置后执行tmux source-file ~/.tmux.conf让配置生效。如果你换了一台新服务器也不想从头再配一遍建议把这份配置直接纳入私人 dotfiles 仓库用一行脚本自动部署到新机器。2.3 SSH 链接的两种方式直连服务器与 WSL 桥接这套环境里SSH 扮演的角色是把你的本地终端和远程服务器连接起来。具体有两种使用场景一种是直接在 WSL 里ssh userserver_ip登录远程机器另一种是在本机 WSL 里安装 SSH 服务端让其他设备也能通过局域网访问到这台 Windows 机器的 Linux 环境。第一种场景最常见的槽点是每次都要输入密码。解决办法是配置密钥登录ssh-keygen -t ed25519 -C your_emailexample.com ssh-copy-id userserver_ip这里用 ed25519 算法而不是传统的 RSA 2048主要是安全性更好、密钥长度更短、生成速度更快。ssh-copy-id命令会自动把你本机的公钥追加到服务器的authorized_keys文件里之后的 SSH 登录就不再需要密码。第二种场景把 Windows 机器当服务器用需要额外配置一下。WSL2 默认的网络地址是 NAT 转换过的外部设备不能直接访问 WSL 里的端口。解决办法是使用 WSL 自带的 localhost 转发——在 Windows 侧访问localhost:端口会默认转发到 WSL 内如果是局域网内其他设备访问就还需要在 Windows 防火墙里放行对应端口或者用netsh interface portproxy做端口代理。实际操作中我建议大部分场景直接用第一种方式把 SSH 的职责限定在“连接远程服务器”这一件事上Windows 本地的 WSL 开发环境保持独立避免端口冲突和网络配置问题。3. Claude Code 的安装配置与 tmux 协同实战3.1 在 WSL 中安装 Claude Code安装 Claude Code 前先保证 WSL 里有 Node.js 环境。这里推荐用 nvm 管理 Node 版本比直接在系统装 npm 包科学太多因为 Claude Code 官方包对 Node 版本有要求如果你系统里还有其他 Node 项目版本冲突会是一个真实存在的问题。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 安装完重新加载一下 shell 环境 source ~/.bashrc nvm install --lts node -v # 确认 node 版本然后全局安装 Claude Codenpm install -g anthropic-ai/claude-code claude --version安装完成后在项目目录里直接执行claude第一次启动会要求登录授权。这个过程必须在终端里完成它会打开浏览器跳转到授权页面确认后回到终端即可使用。如果是在没有图形界面的远程服务器上使用可以在本地 Windows 上完成授权后把~/.claude目录下的凭据文件同步到服务器这样可以避免服务器上执行 OAuth 授权的麻烦。3.2 用 tmux 给 Claude Code 划分专属工作区很多初学者直接在 WSL 的一个普通终端里执行claude任务多了就乱了。我的做法是建一个专门的 tmux 会话按项目或按任务类型开窗口。一个比较稳定的工作区划分如下# 建一个名为 dev 的会话第一个窗口用于常规命令行操作 tmux new -s dev -n shell # 在 dev 会话里新建窗口第一个用于 Claude Code 交互 tmux new-window -t dev -n claude # 在这个窗口里启动 Claude Code tmux send-keys -t dev:claude cd ~/projects/your-project claude Enter # 再开一个窗口用于查看日志和跑测试 tmux new-window -t dev -n logs这样操作下来你得到的实际效果是dev会话里有两个窗口claude窗口专门跑 AI 交互logs窗口专门看输出。在 claude 窗口里向 Claude Code 下达指令让它修改代码、执行构建然后在 logs 窗口里观察服务和测试日志。两个窗口通过 tmux 的窗格或者窗口切换来配合互不干扰。如果任务比较多我还会用 tmux 的窗格功能在 claude 窗口里再分出一半给 bash# 在 dev:claude 窗口右侧开一个垂直窗格 tmux split-window -h -t dev:claude左侧是 Claude Code 对话界面右侧是 Shell 终端你可以在 Claude 生成建议后立刻在右侧验证命令是否正确。这种两个窗格并排的布局非常像 IDE 里的编辑器加终端组合但资源占用远低于跑一个 IDE。3.3 Claude Code 常用操作和自动化场景实测Claude Code 的实际能力边界在哪里我用几个日常场景来说明每一个都是我实际跑过的任务而不是官方的演示话术。第一个场景是修编译报错。我手上一个 Java 项目在升级 JDK 17 后报了一堆编译错误传统做法是逐个文件打开改。我用 Claude Code 的方式是启动claude后直接输入请帮我看一下当前项目的编译错误优先解决与 Java 17 相关的模块访问问题修改前先说明你的方案。Claude Code 会自动读取项目结构执行mvn compile捕获错误然后逐项分析提出修改方案。在它确认方案后会自动修改代码再跑一次编译验证。整个过程里保存的终端输出和修改记录都保留在 tmux 里随时可以翻看。第二个场景是解析日志和排查问题。比如启动服务后日志持续输出但某项指标异常/Users/logs/app.log 里搜索 WARN 级别以上的日志最近 200 条里有没有和 Redis 连接相关的异常帮我统计出现频率最高的错误。输出一份摘要。Claude Code 不需要你手动 grep 和 awk直接描述需求它就能给出总结。而且它读取的是文件内容不是终端输出所以即使日志文件很大它也能分段读取并总结。第三个场景是写测试。这块我非常推荐因为大部分开发者都是能拖就拖但 Claude Code 在生成测试代码这件事上表现相当稳为 src/utils/dateFormatter.ts 这个文件生成单元测试要求覆盖主要格式分支测试框架用 vitest。它生成的测试代码结构完整能直接跑过并且能根据反馈调整测试用例的深度。不过我要强调一点测试生成后的验证必须由你来做Claude Code 生成的测试不一定完全符合项目规范尤其是像 Mock模拟依赖的粒度和边界条件的设计人的判断还是更靠谱的。第四个场景是批量重构。比如把项目里所有var声明改成const或let并且忽略文件头部的自动生成代码。这种大量重复但需要逻辑判断的工作让 Claude Code 去做最合适只需要把要求描述清楚它能批量完成任务并输出修改文件列表。3.4 远程服务器上直接跑 Claude Code 的会话保活效果如果你需要在远程服务器上直接跑 Claude Code比如代码只允许在服务器上编译或者需要在内网专用环境里开发那 tmux 的价值会被发挥到最大。我在一台远程 Linux 服务器上测试过这个流程ssh userserver_ip tmux new -s deploy # 在 deploy 会话中进入项目目录启动 Claude Code cd /var/www/my-app claude然后直接断开 SSH 连接——这里注意不是exit退出而是直接关闭终端窗口或者按Ctrlb d先把 tmux 会话分离。tmux 会话里的 Claude Code 进程会继续运行任务不会中断。第二天重新连接执行ssh userserver_ip tmux attach -t deploy你就能看到昨天 Claude Code 的执行结果还稳稳地躺在终端里甚至可以直接继续上一轮对话。这个特性在本地 WSL 里的效果是一样的所以现在我的日常习惯就是把所有耗时任务全部放进 tmux再也不用担心断连丢进度。4. 常见问题与排查技巧实录4.1 tmux 状态不对、窗口错乱怎么办场景一你attach到旧会话时发现窗口布局和记忆中的不一样。原因是 tmux 默认会把窗口按创建顺序排列你之前手动调整过窗格比例但服务器重启或者 tmux 版本升级后部分布局信息可能丢失。解决方案是日常把常用布局提前固化。在配置~/.tmux.conf里加上一键布局指令bind L source-file ~/.tmux/layout-dev然后创建一个~/.tmux/layout-dev文件里面写清楚你想要的窗口结构select-window -t dev:1 select-pane -t 0 split-window -h select-pane -t 0 resize-pane -R 30 select-window -t dev:2 select-pane -t 0 split-window -v resize-pane -D 20下次需要恢复布局直接按Ctrla L就能一键恢复到熟悉的窗口结构。实际工作中如果你和我一样经常同时管理四五台服务器你会发现把这个布局文件也纳入 dotfiles 仓库克隆下来再配合tmux source-file快速恢复比什么都强。场景二tmux attach时提示 “no sessions” 或 “sessions should be nested with care”。前者说明你还没有创建过会话直接tmux new -s 任意名字创建即可后者说明你已经在某个 tmux 会话里执行了tmux attachtmux 默认不允许嵌套会话这时要么先退出当前会话再 attach要么按两次前缀键Ctrla a d先分离内部会话。4.2 Claude Code 安装或运行时常见报错Claude Code 在 Windows 环境里最常见的报错是claude: command not found。出现这个的原因多半是 npm 全局安装路径没有配置到系统 PATH 里尤其在使用 nvm 管理 Node 的情况下npm 全局包路径往往是~/.nvm/versions/node/vXX/bin需要手动确认~/.bashrc里包含这行export PATH$HOME/.nvm/versions/node/$(node -v)/bin:$PATH另一个高频问题是 PowerShell 下直接运行claude报错。虽然官方支持 Windows PowerShell但有些扩展插件或终端环境变量的兼容性并不如 WSL 稳定。我的建议是在 Windows 下做开发一律通过 WSL 进入 Linux 环境再执行 Claude Code兼容性和稳定性都更好。如果你确实需要在纯 Windows PowerShell 里用那把 PowerShell 升级到 7.x 版本并在安装时勾选“添加到 PATH”选项能省掉大部分坑。还有一类错误是执行命令时提示没有权限例如尝试在项目目录里创建文件失败。这种情况十有八九是文件系统权限问题——在 WSL 里访问/mnt/c/...这种 Windows 挂载路径时Linux 权限模型经常和 Windows NTFS 权限冲突。建议开发项目统一放在 WSL 原生文件系统里比如~/projects不要在/mnt/c底下做开发因为 I/O 性能差异明显权限问题也频繁。4.3 如何控制 Claude Code 的 token 消耗和 API 花费用 Claude Code 的人最关心的两个后续问题这玩意会不会把我 token 烧光怎么省钱首先要明确 Claude Code 的收费模式它可以使用订阅账户的 Claude Pro/Max 额度也可以绑定 Anthropic API Key 按 token 计费。我的经验是日常开发直接用 Claude 订阅额度更划算但注意它每周是有使用上限的——这也是很多人在网上吐槽“提示 limits 被暂时提高”的原因。控制 token 消耗的几个实际技巧第一尽量在干净的仓库里启动 Claude Code不要让它默认把整个项目都读一遍。在项目根目录创建.claudeignore文件把node_modules/、dist/、build/、*.lock这些不相关的文件和目录全部过滤掉。第二一次性把需求说清楚避免多次往返对话Claude Code 在对话上下文里保留太多历史会显著增加 token 开销你可以在对话里说“我们换个新话题请忘记之前的操作”它支持在会话内重置上下文也可以直接退出重新claude。第三用--print模式跑一次性任务。比如claude -p 检查 src/utils 目录下所有文件总结每个导出的功能这个-p参数会让 Claude Code 执行完就退出不开启交互式会话不会留下大量未使用上下文。实际测试下来规范使用.claudeignore和-p模式后token 消耗可以减少一半以上。这个经验对使用 API 计费的用户更重要——API 模式下一轮长对话消耗几个美元是常有的事而订阅额度的用户则相当于省下了每周的额度配额。4.4 Claude Code 与 Codex 的选择问题很多人在用 Claude Code 之前会先接触到 OpenAI 的 Codex。这两个工具定位很像都是命令行人机编程工具但实际用下来差异不小。Claude Code 在自然语言理解和代码生成的“结果质量”上明显更贴近资深工程师交互式对话能力强尤其在重构和测试生成这类需要“理解项目背景”的任务上效果更稳。Codex 的优势在于更早模型在 GitHub Copilot 那套代码补全体系上积累的工程经验和更开放的生态策略而且初学者在纯 Windows PowerShell 环境里安装运行 Codex 的失败率比 Claude Code 低。如果你只有精力专注一个我更推荐 Claude Code——理由很直接它和 tmux 的组合是这套环境的核心而 Claude Code 在长会话、复杂任务场景下的表现更接近一个“坐你旁边的同事”。Codex 我也在用但主要是比对各模型的输出结果和用来做快速实验不会作为主力。5. 把流程固化成习惯我的每日操作节奏环境搭好只是第一步真正提升效率的是一套顺手的工作习惯。我现在的日常操作基本是这样循环的第一开机后打开 Windows Terminal点击 Ubuntu 标签页进入 WSL。执行tmux attach -t dev如果在服务器上就是先ssh再tmux attach。这样打开电脑的第一件事就是恢复到昨天的工作现场tmux 状态栏里会清楚显示当前在哪个项目、哪个窗口。第二根据当天任务决定下一步。如果需要进一步开发切到claude窗口用自然语言描述今天想做的事让 Claude Code 先梳理思路然后逐步推进。如果只是普通编译、部署、看日志切到对应的shell窗口直接操作。第三所有耗时操作全部放到 tmux 会话里执行。比如构建要跑 10 分钟那就放心让它跑该开会开会该吃饭吃饭回来tmux attach直接查看结果。如果有人这时候远程连上同一台服务器他甚至能看到我们共用一个 tmux 会话协同工作。第四每周用一次tmux list-sessions也就是tmux ls检查所有会话把不需要的会话关掉避免堆积太多僵尸会话。这套流程适应了一个星期之后我对远程开发这件事的心态发生了不小的变化以前打开电脑总有一种“又要开始了”的负担感现在打开就是直接进入工作上下文所有历史状态都摆在那里非常踏实。最后再分享一个小技巧tmux 的会话名字尽量不要用默认的0、1用项目名或任务名来命名比如tmux new -s blog-site、tmux new -s api-server。当你同时在多个服务器上工作时名字信息能省掉大量不必要的来回切换和确认操作。这个东西配合 Claude Code 使用就是一套很完整的云端开发工作台了你随时可以在任何时间、任何地点找回你的工作现场。