1. 出差在外,家里 Claude Code Agent 断了怎么办
人在高铁上,手机弹出一条告警:家里那台 Mac mini 上的 Claude Code Agent 已经 20 分钟没有新输出。你手里只有一部手机,日志全在家里那台机器的终端里。等晚上回到酒店再处理,最好的排错现场早就没了——进程可能已经退出,滚动缓冲区里的报错也刷没了。
这个场景我遇到过不止一次。远程运维 Claude Code Agent 的核心诉求,其实不是「远程桌面」,而是保住终端现场。你需要的是:手机能安全地连回家里那台机器,看到一个还在运行的会话,翻到断点前的日志,然后决定是继续跑还是重启。
围绕这个目标,我用三个工具搭了一条最小可用链路:Tailscale 负责组网,SSH 负责进入,tmux 负责保活。三者各管一段,不重叠,也不需要公网 IP,更不用额外买一台 VPS 做跳板。
先说清楚这套方案适合谁:家里有一台长期开机、跑 Claude Code 或类似 Agent 的机器(Mac mini、NUC、旧笔记本都行);你经常出差或在外,需要临时查看和恢复任务;你愿意花 20 分钟做一次配置,之后每次救场只要 1 分钟。如果你只是偶尔用一下、机器随时关机,那这套方案的价值不大。
为什么不用 Claude Code 自带的远程能力?我试过/rc,在多数网络下能用,但救急时最怕的不是功能少,而是连到一半断掉。所以我准备了一条更通用的路径:手机 SSH 客户端 → Tailscale 加密网络 → 家里的 Mac → tmux 持久会话 → Claude Code 与日志。这条链路不依赖某个产品的远程功能,只要 SSH 能通,就能救。
Tailscale 在这里的作用是让手机和 Mac 像在同一个私有网络里。它会优先尝试设备间直连,网络条件不允许时也可能走 DERP 中继,但全程是端到端加密的。所以准确说法是「优先点对点、全程加密」,而不是「绝对不经过任何中继」。这一点在排查连接慢的时候很关键,后面会讲。
三个工具的分工可以这样理解:Tailscale 让手机和 Mac 处于同一个私有网络,不把 SSH 端口暴露到公网;SSH 让你从手机进入 Mac 的终端;tmux 让任务和会话留在 Mac 上,手机断线后依然继续运行。其中 tmux 是整套方案的关键——手机只是一个窗口,真正的会话一直在 Mac 上。你切换 Wi-Fi、关掉 App、甚至短时断网,排查任务都不会跟着消失。
配置之前,安全边界必须先说清楚。远程 SSH 很方便,也意味着手机一旦丢失,风险会放大。我的做法是:优先使用 SSH 密钥,不把 Mac 登录密码写进任何脚本、提示词或聊天记录;只允许自己的 Tailscale 设备访问,绝不把 22 端口暴露到公网;手机设置系统锁和生物识别,SSH 私钥放在受保护的钥匙库;限制可登录用户,确认密钥登录可用后再关闭密码认证;对能操作生产环境的 Agent 再加一层人工确认,不让远程连接等于无限权限。密码应该由本人交互输入,或者干脆改用密钥认证,不要交给 AI 去「帮你配」。
2. TaoToken 统一 Key 通道的前置准备
Agent 能远程连上了,下一个问题是:Claude Code 本身怎么稳定地拿到模型能力。如果你在家里那台机器上用的是某个临时 Key,或者每个项目各配一份,出差时想换通道就得改一堆文件,非常麻烦。我的做法是把 Claude Code 的 Base URL 统一指向 TaoToken 的 API 通道,用一把 Key 管所有调用。
TaoToken 在这里扮演的是统一入口:官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。它的价值在于,你不需要在每台机器、每个项目里维护不同的供应商配置,只要把 Base URL 和 Key 写对,Claude Code 就能通过同一条通道请求模型。对远程运维来说,这一点很重要——你在手机上改配置时,只需要确认一个地址和一把 Key,而不是翻五个文件。
前置准备分三块。第一块是账号与 Key:登录 TaoToken 控制台,在 API Keys 页面创建一把 Key。建议按用途命名,比如home-agent,方便以后区分和吊销。创建后立刻复制保存,页面通常只显示一次。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite ,API Keys 页面是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite 。
第二块是确认模型 ID。Claude Code 走的是 Anthropic 兼容协议,你需要知道当前可用的模型标识。可以在模型对话页面先手动发一条消息验证通道是否正常,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite 。如果对话能正常返回,说明 Key 和通道都没问题,再去配 Claude Code 就少一层变量。
第三块是网络与机器状态。家里那台 Mac 要确认三件事:Tailscale 已登录且在线、远程登录已开启、tmux 已安装。这三件事在上一节已经讲过,这里再强调一次顺序——先保证 SSH 能进,再改 Claude Code 配置。否则你改完配置发现连不上机器,会分不清是网络问题还是配置问题。
关于 Key 的管理,我踩过的坑是:早期把 Key 直接写进了 shell 的~/.zshrc,结果换机器时忘了同步,Claude Code 一直报 401。后来改成用环境变量文件单独管理,并且在家里那台机器上只保留一份。这样远程 SSH 进去后,source一下就能用,也不会污染其他项目。
如果你打算长期跑 Agent,而不是临时救场,可以考虑 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite 。它更适合持续性的编码和 Agent 任务,Key 和通道的管理也更集中。临时救场用按量 Key 就够了,长期跑再上 Plan,这是我自己的选择逻辑。
还有一点:Claude Code 的配置改动,建议在 tmux 会话里做,而不是新开一个 SSH 窗口。原因很简单——你改配置、重启 Claude Code、观察输出,这一串动作都在同一个会话里,手机断线也不会丢现场。这正是 tmux 的价值所在。
3. 可复制的 Tailscale、SSH、tmux 与 settings 配置
这一节给可直接复制的配置。分四部分:Tailscale 子网与设备、SSH 免密、tmux 会话、Claude Code 的 settings 片段。每一步都说明改哪个文件、写什么内容、怎么验证。
先说 Tailscale。家里 Mac 和手机都安装 Tailscale 并登录同一个 tailnet。Mac 端记下它的 Tailscale 地址,通常是100.x.x.x,也可以启用 MagicDNS 用设备名访问。如果你希望手机能访问家里其他设备(比如路由器管理页),可以在 Mac 上开启子网路由:
# macOS 上开启 IP 转发(临时,重启失效) sudo sysctl -w net.inet.ip.forwarding=1 # 宣告子网路由,例如家里网段是 192.168.1.0/24 tailscale up --advertise-routes=192.168.1.0/24然后在 Tailscale 管理后台批准这条路由。注意:子网路由不是必须的,如果你只需要 SSH 到 Mac 本身,跳过这步即可。开启后手机就能通过 tailnet 访问家里网段的其他设备,排查路由器、NAS 时有用。
接着是 SSH 免密。在手机 SSH 客户端里生成一对密钥(Termius 等客户端都支持),把公钥内容追加到 Mac 的~/.ssh/authorized_keys:
# 在 Mac 上执行,确保目录权限正确 mkdir -p ~/.ssh && chmod 700 ~/.ssh touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys # 把手机客户端的公钥粘贴进来(示例,替换成你自己的公钥) echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your-phone" >> ~/.ssh/authorized_keysMac 端开启远程登录:系统设置 → 通用 → 共享 → 远程登录,只勾选需要的用户。确认手机能用密钥登录后,再考虑关闭密码认证。第一次连接时认真核对主机指纹,不要看到提示就直接点接受。
tmux 部分。Mac 上安装:
brew install tmux创建持久会话并启动 Claude Code:
# 创建名为 lobster 的会话 tmux new -s lobster # 在会话内启动 Claude Code claude手机断线后重新连接:
# 查看现有会话 tmux ls # 恢复指定会话 tmux attach -t lobster如果会话被意外关闭,可以查看是否有残留:
tmux ls 2>/dev/null || echo "no session"最后是 Claude Code 的 settings 片段。Claude Code 读取的配置文件通常在~/.claude/settings.json,把 Base URL 和 Key 指向 TaoToken:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoToken密钥", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }如果你用的是项目级配置,可以放在项目根目录的.claude/settings.json,内容结构相同。注意三点:Base URL 用https://taotoken.net/api,不要多加路径;Key 用你在控制台创建的那把;Model ID 用当前可用的标识,不确定就先去模型对话页面确认。
改完配置后,在 tmux 会话里重启 Claude Code,让它重新读取 settings。如果你同时用 Codex 或 Cline,它们的配置位置不同,但三件套是一样的:Base URL、Key、Model ID。比如 Codex 的auth.json里同样要写全这三项,缺一个都会报错。
4. 验证请求与远程恢复的完整动作
配置写完不算完,必须验证。验证分两层:先验证 TaoToken 通道本身能通,再验证 Claude Code 能通过这条通道正常请求。
第一层,用 curl 直接打 TaoToken 的 API。这一步在 Mac 上执行,确认 Key 和网络都没问题:
curl -sS https://taotoken.net/api/v1/messages \ -H "x-api-key: sk-你的TaoToken密钥" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 64, "messages": [{"role": "user", "content": "ping"}] }'如果返回里有content字段和正常的文本,说明通道通了。如果返回 401,说明 Key 不对或没带上;如果返回模型不存在,说明 Model ID 写错了。这一步能把「网络问题」和「配置问题」分开,非常关键。
第二层,在 tmux 会话里启动 Claude Code,发一条简单指令,比如「列出当前目录文件」。观察它是否能正常返回。如果 Claude Code 报reading choices之类的解析错误,通常是返回体格式不符合预期,先回到第一层确认 curl 是否正常。
远程恢复的完整动作,我按顺序列一遍。手机上打开 Tailscale,确认已连接(状态显示 Connected)。打开 SSH 客户端,用密钥登录 Mac。执行tmux attach -t lobster恢复现场。先看日志和进程状态,不要急着重启:
# 查看 Claude Code 相关进程 ps aux | grep -i claude # 查看最近的输出(如果 Agent 有写日志文件) tail -n 100 ~/agent.log确认问题后,再决定是继续跑还是重启。如果是 Key 过期或配置被改,改完 settings 后重启 Claude Code。修复后验证服务、告警和关键任务是否恢复。整个过程都在 tmux 会话里完成,手机断线也不影响。
这里有个实用技巧:在 tmux 里开两个窗格,一个跑 Claude Code,一个跑tail -f看日志。这样你能同时看到 Agent 的输出和日志的变化,排查效率高很多。窗格操作是Ctrl+b然后%垂直分屏,Ctrl+b然后方向键切换。
验证成功后,建议把这次恢复过程记一笔:什么原因断的、改了什么、怎么验证的。下次再遇到类似问题,直接翻记录,比重新排查快得多。
5. 常见报错排查:401、local proxy failed 与 OAuth
远程救场时最容易卡在几个固定报错上。这一节按真实报错对照排查,每个都给出定位方法和修复动作。
401 Unauthorized。这是最常见的。表现是 Claude Code 或 curl 返回 401,提示认证失败。原因通常有三个:Key 写错或过期、Key 没带上、Base URL 指向了错误的地址。排查顺序:先用第 4 节的 curl 命令单独测 Key,确认 Key 本身有效;再检查settings.json里ANTHROPIC_AUTH_TOKEN是否和 curl 用的一致;最后确认ANTHROPIC_BASE_URL是https://taotoken.net/api,没有多余斜杠或路径。如果 curl 通但 Claude Code 报 401,多半是 Claude Code 没读到 settings,检查文件路径和 JSON 格式。
local proxy failed。这个报错通常出现在你本地配了代理,但代理没起来或端口不对。表现是 Claude Code 启动时报连接本地代理失败。排查:检查环境变量里是否有HTTP_PROXY、HTTPS_PROXY指向了一个不存在的本地端口;如果有,先 unset 掉再试。注意,这里说的是本地开发环境的代理配置,不是网络层面的方案,两者不要混。修复动作:
# 查看当前代理相关环境变量 env | grep -i proxy # 临时清除(当前 shell 有效) unset HTTP_PROXY HTTPS_PROXY ALL_PROXYreading choices 解析错误。表现是 Claude Code 收到返回后解析失败,提示读取 choices 出错。这通常说明返回体不是预期的 Anthropic 格式,可能是 Base URL 指到了 OpenAI 兼容端点,或者 Model ID 不被支持。排查:确认 Base URL 是https://taotoken.net/api,Model ID 是 Anthropic 系列标识;用 curl 看返回体的结构,正常应该有content数组。如果返回体是choices结构,说明端点用错了。
OAuth 相关报错。如果你之前用 Claude Code 的登录流程做过 OAuth 授权,切换 Base URL 后可能残留旧的凭证,导致冲突。表现是启动时提示 OAuth 失败或凭证无效。排查:检查~/.claude/下是否有旧的凭证文件,必要时清理后重新用 Key 认证。注意,这里说的是清理本地残留凭证,不是绕过任何认证机制。
连接超时或 Tailscale 不通。表现是 SSH 连不上 Mac。排查顺序:手机 Tailscale 是否 Connected;Mac 的 Tailscale 是否在线;Mac 是否休眠。如果 Mac 休眠了,SSH 自然连不上。临时可以用caffeinate -i防止休眠,但这不是长期方案。长期运行需要配置电源策略和开机自启。
tmux 会话找不到。表现是tmux attach -t lobster提示 session not found。原因可能是 Mac 重启过,或者会话被手动关闭。先用tmux ls看有没有其他会话;如果没有,说明会话确实没了,只能重新创建并启动 Claude Code。这也是为什么长期任务建议配合开机自启和健康检查。
排查时的一个原则:先分层,再定位。网络层(Tailscale 通不通)、接入层(SSH 能不能进)、应用层(Claude Code 能不能请求)、配置层(Key 和 Base URL 对不对),一层一层往下查,不要一上来就改配置。多数问题在分层后一眼就能看出在哪一层。
6. 把远程救场变成日常习惯
这套方案跑顺之后,我把它变成了日常习惯,而不是等出事才用。具体做法有几个。
第一,家里那台 Mac 上的 Claude Code 永远跑在 tmux 会话里,会话名固定,比如lobster。这样无论我在哪,只要 SSH 进去tmux attach -t lobster,就能看到现场。会话名固定还有个好处:手机 SSH 客户端的快捷命令里存一条,一键恢复。
第二,Key 和 Base URL 只维护一份。所有项目共用同一个~/.claude/settings.json,需要区分时用项目级配置覆盖。这样换 Key 只改一个地方,不会出现某个项目还在用旧 Key 的情况。
第三,定期验证通道。不用等到出事,每周用 curl 打一次 API,确认 Key 有效、通道正常。这个动作 10 秒完成,但能避免关键时刻掉链子。
第四,接受这套方案的边界。如果 Mac 关机、系统卡死、路由器断网,或者 Tailscale 本身没启动,手机 SSH 也救不了。要覆盖这些情况,需要智能插座、带外管理、备用网络或自动拉起机制。远程 SSH 是救场工具,不是完整的高可用方案。想清楚这一点,你就不会对它有不切实际的期待。
如果你还在用临时 Key、每个项目各配一份,建议趁这次整理一下,把 Base URL 统一到 TaoToken 的通道上。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite ,API Keys 在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_campaign=rewrite 。先把 curl 验证跑通,再改 Claude Code 配置,顺序不要反。
最后说一个我自己的习惯:每次远程救场后,把「断的原因、改的动作、验证的结果」三行记在备忘录里。攒上几次,你会发现大部分故障就那几类,排查越来越快。技术真正好用的时候,是让人少赶一次路,少丢一次排错现场。人在外面,手机能安全地回到家里的终端,这就够了。