1. 多台 Ubuntu 上 Claude 记忆不同步,到底卡在哪
如果你手上有两台以上 Ubuntu 机器,一台在实验室、一台在宿舍、一台在云主机,大概率会遇到这个场景:在 A 机器上让 Claude Code 改了一半的论文,换到 B 机器打开同一个项目,对话历史没了、CLAUDE.md 里刚加的规则没生效、连之前让它记住的偏好都像失忆一样。这不是 Claude 坏了,而是它的「记忆」本来就分散在几个不同的文件里,每台机器各存各的。
Claude Code 的记忆体系其实分两层:一层是项目目录里的.claude/和CLAUDE.md,另一层是主目录下的~/.claude/和~/.claude.json。前者跟着项目走,后者跟着用户走。问题就出在后者——~/.claude/projects/里存着每个项目的对话历史,~/.claude.json里存着 OAuth 状态、UI 开关、个人 MCP 配置。你在 A 机器聊了一下午,这些内容全落在 A 的~/.claude/里,B 机器根本看不到。
我试过最直接的思路:把整个工作区放到云盘,然后每台机器都指向它。但云盘同步有延迟,Claude 写文件的时候如果云盘正在上传,容易读到半截文件。后来换成软链接方案——把~/.claude和~/.claude.json都软链到工作区目录下,工作区本身再用 Git 私密仓库或局域网共享同步。这样 Claude 读写的永远是同一份物理文件,多台机器看到的就是同一份记忆。
这套方案适合谁?适合手上有 2 到 5 台 Ubuntu 设备、经常在不同机器间切换同一个项目、又不想每次手动导出导入对话记录的人。不适合只在一台机器上写代码的人,也不适合项目路径经常变的人——因为对话历史里存的是绝对路径,路径一变就找不到文件。
还有一个容易被忽略的点:Claude Code 的 API 通道。多台机器如果各自配各自的 Key,额度分散、账单分散,排查问题也麻烦。用 TaoToken 统一一个 Key 走同一个 API 通道,配合软链接同步,才是完整的「跨机记忆 + 跨机调用」方案。下面从环境准备开始,一步步把这条链路搭起来。
2. TaoToken 前置准备:统一 Key 与 API 通道
在动软链接之前,先把 API 通道统一掉。原因很简单:软链接同步的是「记忆」,但记忆里如果混着不同机器的 Key 和 Base URL,同步过去反而会互相覆盖。统一用 TaoToken 的 Key,所有机器读同一份配置,就不会出现 A 机器能跑、B 机器 401 的情况。
TaoToken 在这里的角色是统一的大模型 API 入口。你不需要在每台 Ubuntu 上分别去各家厂商申请 Key,只需要一个 TaoToken 的 Key,就能通过同一个 Base URL 调用 Claude 系列模型。对多机场景来说,这省掉的是「每台机器都要重新配一遍环境变量」的重复劳动。
先注册并拿到 Key。打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后在控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 列表在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。创建的时候建议起个能认出来的名字,比如ubuntu-multi-sync,方便以后多台机器共用一个 Key 时排查。
拿到 Key 之后,先确认你要用的模型 ID。Claude Code 场景下常用的是 Claude 系列模型,具体可用的模型 ID 在模型对话页面能看到:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。记下你选定的 Model ID,后面写进 settings.json 要用。
API 的基础地址是https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 Base URL 使用。如果你用的是 Anthropic 兼容协议,Claude Code 的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有 Base URL 和鉴权头的写法。Claude Code 专用的接入说明在 https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite ,如果你后面要跑 Agent 或长期编码任务,Coding Plan 的说明在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。
这里有个关键决策:Key 放在哪。因为我们要把~/.claude软链到工作区,而工作区可能会用 Git 同步,所以 Key 绝对不能明文提交到公开仓库。两个做法:一是用私密仓库,二是把 Key 放在环境变量里,settings.json 里只引用变量名。我推荐后者,下面配置章节会给出具体写法。
前置准备做完,你应该手上有三样东西:一个 TaoToken Key、一个确定的 Model ID、一个确定的工作区绝对路径。工作区路径建议所有机器保持一致,比如都用/home/你的用户名/workspace,用户名也尽量一致,原因在下一章会讲。
3. 可复制配置:软链接命令与工作区目录结构
这一章是核心,所有命令都可以直接复制。先明确目标:把~/.claude和~/.claude.json从主目录「搬」到工作区,然后在主目录建软链接指回去。这样 Claude 读写主目录路径时,实际落到的是工作区文件,多台机器同步工作区就等于同步记忆。
第一步,确认工作区路径。假设你的工作区是/home/pcie/workspace,先进入主目录看看现状:
cd ~ ls -la | grep claude你应该能看到.claude目录和.claude.json文件。先备份一份,防止操作失误:
cp -r ~/.claude ~/.claude.bak cp ~/.claude.json ~/.claude.json.bak第二步,把配置复制到工作区。注意这里用cp -r保留目录结构,复制完一定要检查内容是否完整:
cp -r ~/.claude /home/pcie/workspace/ cp ~/.claude.json /home/pcie/workspace/ ls -la /home/pcie/workspace/.claude ls -la /home/pcie/workspace/.claude.json确认工作区里的.claude目录下有projects/、sessions/、settings.json这些内容,.claude.json文件大小和原来一致。这一步如果复制不全,后面软链接过去就是空的,Claude 会重新初始化,记忆就丢了。
第三步,删除主目录下的原配置,建软链接。软链接的目标必须是绝对路径:
rm -rf ~/.claude rm -f ~/.claude.json ln -s /home/pcie/workspace/.claude ~/.claude ln -s /home/pcie/workspace/.claude.json ~/.claude.json第四步,验证软链接是否生效:
ll ~/.claude*正常输出应该是这样的:
lrwxrwxrwx 1 pcie pcie 53 Aug 12 17:06 /home/pcie/.claude -> /home/pcie/workspace/.claude/ lrwxrwxrwx 1 pcie pcie 58 Aug 12 17:06 /home/pcie/.claude.json -> /home/pcie/workspace/.claude.json看到箭头指向工作区就对了。这一步每台需要同步的 Ubuntu 都要做,少做一台那台就是独立的记忆,不会跟其他机器共享。
接下来配置 TaoToken 接入。Claude Code 读取的 settings.json 有两个位置:项目级的.claude/settings.json和全局的~/.claude/settings.json。因为我们把~/.claude软链到了工作区,所以全局配置实际写在工作区的.claude/settings.json里。用编辑器打开:
nano /home/pcie/workspace/.claude/settings.json写入以下内容,注意把你的Key和你的ModelID替换成实际值:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "你的Key", "ANTHROPIC_MODEL": "你的ModelID" }, "permissions": { "allow": [], "deny": [] } }如果你不想把 Key 明文写在文件里,可以改成引用环境变量。先在~/.bashrc里加一行:
export TAOTOKEN_API_KEY="你的Key"然后 settings.json 里写成:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "${TAOTOKEN_API_KEY}", "ANTHROPIC_MODEL": "你的ModelID" } }这样即使工作区被同步到别的机器,只要那台机器也设了同名环境变量,就能正常调用。三件套 Base URL、Key、Model ID 一个都不能少,缺哪个都会报错。
工作区目录结构建议统一成下面这样,所有机器保持一致:
/home/pcie/workspace/ ├── .claude/ │ ├── projects/ # 对话历史,按项目路径分目录 │ ├── sessions/ # 会话状态 │ ├── settings.json # 全局配置,含 TaoToken 接入 │ └── ... ├── .claude.json # 全局状态、OAuth、UI 开关 ├── CLAUDE.md # 全局指令 ├── settings.json # 项目级配置 └── Paper_LaTeX/ # 实际项目目录这里有个坑要提前说:.claude/projects/里的目录名是按项目绝对路径生成的,里面还包含用户名。比如 A 机器上叫-home-pcie-workspace-Paper_LaTeX,B 机器如果用户名是ubuntu,就会变成-home-ubuntu-workspace-Paper_LaTeX。目录结构一样但用户名不一样,Claude 就认不出这是同一个项目,对话历史对不上。解决办法是手动把两边的目录名改成一致,或者干脆所有机器用同一个用户名。这是整个方案里最容易翻车的地方,下一章验证时会具体演示怎么查。
4. 验证请求与多机同步结果
配置写完,先在本机验证 TaoToken 通道能不能通。最直接的方式是用 curl 打一次 API:
curl https://taotoken.net/api/v1/messages \ -H "x-api-key: 你的Key" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "你的ModelID", "max_tokens": 64, "messages": [{"role": "user", "content": "回复 ok 两个字母"}] }'如果返回里有content字段且内容是ok,说明 Key、Base URL、Model ID 三件套都对。如果返回 401,说明 Key 有问题;如果返回 model not found,说明 Model ID 写错了。这一步过了,再进 Claude Code 验证。
进入工作区,启动 Claude Code:
cd /home/pcie/workspace claude在对话里输入/status,看它显示的 API 端点和模型。如果显示的是https://taotoken.net/api和你配置的 Model ID,说明 Claude Code 已经走 TaoToken 通道了。再随便问一句,能正常流式返回就说明链路通了。
接下来验证记忆同步。在 A 机器上做两件事:一是让 Claude 记住一个偏好,比如「以后回答都用中文」;二是在某个项目里聊几句,产生对话历史。然后退出 Claude,检查工作区里的文件:
ls -la /home/pcie/workspace/.claude/projects/ cat /home/pcie/workspace/.claude.json | head -20你应该能看到projects/下多了一个以项目路径命名的目录,里面是.jsonl格式的对话记录。.claude.json里也能看到最近的项目记录。
现在把这台机器的工作区同步到 B 机器。如果你用 Git 私密仓库:
cd /home/pcie/workspace git add .claude .claude.json CLAUDE.md settings.json git commit -m "sync claude memory" git pushB 机器上:
cd /home/pcie/workspace git pull如果你用局域网共享或云盘,直接复制整个工作区目录即可。同步完在 B 机器上启动 Claude,输入/status确认通道,然后问它「我之前让你记住什么了」。如果它能答出「用中文回答」,说明记忆同步成功。
但这里大概率会遇到路径不匹配的问题。检查 B 机器上的 projects 目录名:
ls /home/pcie/workspace/.claude/projects/如果 A 机器生成的是-home-pcie-workspace-Paper_LaTeX,而 B 机器因为用户名不同生成的是-home-ubuntu-workspace-Paper_LaTeX,Claude 在 B 机器上打开Paper_LaTeX项目时,会去找-home-ubuntu-workspace-Paper_LaTeX这个目录,找不到就当成新项目,历史对话就丢了。解决办法是手动重命名:
cd /home/pcie/workspace/.claude/projects/ mv -home-ubuntu-workspace-Paper_LaTeX -home-pcie-workspace-Paper_LaTeX更彻底的做法是所有机器统一用户名和工作区路径。如果做不到,就在每次同步后检查一遍 projects 目录名,把不一致的改过来。这个操作不复杂,但漏一次就会丢一次历史。
验证成功后,你可以在 A 机器改文件、聊对话,同步到 B 机器,B 机器上的 Claude 能看到同样的上下文。这就是「登录一个账号、所有问答记录共享」的效果,只不过是用软链接和统一工作区自己搭出来的。
5. 本篇常见错排查:401、路径不匹配与软链接失效
这一章把实际会撞到的报错列出来,对照着查。
报错一:401 Unauthorized 或 invalid api key
这是最常见的。先确认 Key 有没有写对,注意不要有多余空格。用 curl 单独测一次:
curl -I https://taotoken.net/api/v1/messages \ -H "x-api-key: 你的Key" \ -H "anthropic-version: 2023-06-01"如果 curl 也 401,说明 Key 本身有问题,去控制台 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 重新生成一个。如果 curl 通了但 Claude Code 还 401,说明 settings.json 没被读到。检查文件路径:
cat /home/pcie/workspace/.claude/settings.json确认ANTHROPIC_AUTH_TOKEN字段存在且值正确。注意 Claude Code 读的是~/.claude/settings.json,而~/.claude是软链接,所以实际读的是工作区里的那份。如果软链接断了,Claude 会去读一个不存在的路径,配置就丢了。
报错二:local proxy failed 或 connection refused
这个通常出现在你之前配过本地代理,环境变量里还留着HTTP_PROXY或HTTPS_PROXY。检查:
env | grep -i proxy如果有输出,在~/.bashrc里把这些变量注释掉,然后source ~/.bashrc。TaoToken 的 API 地址是直连的,不需要走本地代理。另外确认 Base URL 写的是https://taotoken.net/api,不要多加/v1或结尾斜杠,Claude Code 会自己拼路径。
报错三:reading choices 相关解析错误
这个一般出现在流式响应解析阶段,原因可能是 Model ID 写错,或者用了不兼容的模型。确认你填的 Model ID 在模型列表里存在:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。另外检查 settings.json 里ANTHROPIC_MODEL的值有没有拼写错误,大小写敏感。
报错四:OAuth 相关提示或反复要求登录
Claude Code 有时会尝试走 OAuth 登录流程。如果你已经用 API Key 配置了,还在提示 OAuth,说明.claude.json里的状态和 settings.json 冲突。检查.claude.json里有没有残留的 OAuth 字段,或者直接删掉.claude.json让它重新生成:
rm /home/pcie/workspace/.claude.json注意删之前确认软链接还在,删的是工作区里的文件。重新启动 Claude 后它会生成新的.claude.json,再同步到其他机器。
报错五:软链接失效,~/.claude变成普通目录
有时候 Claude 或某些操作会把软链接替换成真实目录。检查:
ls -la ~/.claude如果显示的是drwxr-xr-x而不是lrwxrwxrwx,说明软链接被替换了。重新建:
rm -rf ~/.claude ln -s /home/pcie/workspace/.claude ~/.claude同样检查~/.claude.json。这个坑在多机同步时特别隐蔽,因为一台机器软链接断了,它的记忆就独立了,但表面上 Claude 还能正常跑,直到你发现对话历史对不上。
报错六:projects 目录名不匹配导致历史丢失
前面提过,这里再强调一次。检查方法:
ls /home/pcie/workspace/.claude/projects/对比两台机器的输出,如果目录名里的用户名或路径不同,手动改成一致。改完之后 Claude 就能认出来了。如果你经常换机器,建议写个脚本在同步后自动检查并重命名。
排查顺序建议:先 curl 测 Key,再查 settings.json 路径,再查软链接,最后查 projects 目录名。大部分问题出在前两步,路径和软链接的问题占剩下的大半。
6. 跨机调用与长期编码的 CTA 分流
软链接和统一工作区解决的是「记忆同步」,TaoToken 解决的是「调用通道统一」。两者配合起来,多台 Ubuntu 上的 Claude 才真正像同一个账号。如果你只是偶尔在几台机器间切换,把上面的配置跑通就够了。
如果你后面要在多台机器上跑长期编码任务或 Agent,建议看一下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它适合那种需要持续调用、额度消耗比较大的场景,比按次调用更划算。
日常验证模型是否正常,或者临时问几个问题,用模型对话页面就行:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。接入过程中遇到报错,先翻接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Claude Code 专用的说明在 https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 。Key 的管理和重新生成在控制台:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
最后说一个实际经验:软链接方案最怕的是「同步冲突」。如果两台机器同时改同一个.claude.json,Git 合并时会冲突。我的做法是尽量不在两台机器上同时开 Claude,切换机器前先 commit 并 push,到另一台先 pull 再启动。这样虽然笨,但不会丢数据。如果你用云盘同步,注意云盘的冲突文件命名规则,看到xxx (冲突).json这种文件要手动处理,别直接删。