SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-25

Claude Code 会话如何互相发送消息

Claude Code v2.1.224 起支持同一 VPS 上的会话通信。了解 ListAgents 和 SendMessage 的用途、第二个会话何时值得使用,以及消息为何会被暂存。

Claude Code 会话之间相互发送消息的含义

当两个 Claude Code 会话运行在同一台计算机上,并使用同一个操作系统用户时,它们可以相互发送消息。一条消息是一个 Claude 为另一个 Claude 编写的一段纯文本。消息不包含对话历史或文件。Claude 使用 ListAgents 工具查找另一个会话,再使用 SendMessage 传递文本,因此您无需手动调用这两个工具。您只需说明另一个会话需要了解的内容,Claude 会自行编写消息。

此功能称为跨会话消息传递。截至 2026 年 8 月,它需要 Claude Code v2.1.224 或更高版本,并且可在 macOS 和 Linux 上运行,包括 WSL 2 中的 Linux。它不原生支持 Windows,也不适用于 Amazon Bedrock、AWS 上的 Claude Platform、Google Cloud 的 Agent Platform 或 Microsoft Foundry。会话满足这些要求后,消息传递功能已自动启用,无需进行任何配置。以下行为说明来自 Anthropic 的跨会话消息传递文档。

VPS 是这项功能最有用的场景,因为会话会在 VPS 上持续运行足够长的时间,值得进行寻址。在笔记本电脑上,您合上屏幕后会话通常就失去作用。在运行 tmux 的服务器上,您星期一启动的会话到了星期四可能仍在运行,并继续保留某个代码仓库的上下文。当您有两个这样的会话后,它们如何通信就不再只是理论问题。如果您还没有完成配置,请先阅读在 VPS 上通过 tmux 运行 Claude Code,其中介绍了本指南所需的会话基础配置。

何时值得使用第二个会话

先考虑成本。每个会话都是独立的 Claude 实例,并拥有自己的上下文窗口。因此,在相同时间内,两个会话的成本大约是一个会话的两倍。发送的消息与您输入的提示一样,都会计入用量。协调并不是免费的;如果工作本质上是一系列连续步骤,将其拆分到多个会话中会使过程更慢、成本更高。

值得使用第二个会话的情况通常具有相同特征:两项工作可以同时运行,彼此无需等待,并且其中一项在执行过程中获得了另一项所需的信息。

  • 一个会话发现了破坏性变更,而另一个会话正基于受影响的代码继续开发。Claude 会总结该变更并发送出去,您无需在另一个终端中重新输入。
  • 两个会话在同一仓库的独立 git worktree 中工作,其中一个需要了解已经合并的内容。
  • 长时间运行的迁移或测试任务将结果发送回您正在查看的会话。
  • 一个构建会话和一个审查会话:审查会话读取构建会话生成的内容,并返回发现的问题。

如果工作是连续执行的,或者两个会话都会编辑相同的文件,请使用一个会话。如果您希望 Claude 在单个任务中创建并监管一个协作组,这属于 agent teams,是一项独立且仍处于实验阶段的功能。如果您只是想在另一个终端中继续同一段对话,请恢复该会话。跨会话消息传递适用于彼此独立、由您自行启动和控制的会话。

在围绕该功能规划前,先确认功能是否存在

先查看版本:

claude --version

将版本号与 2.1.224 比较。然后在会话中输入 /list-agents;该命令也可通过 /peers 调用。它会列出当前会话可以访问的所有代理,以及每个代理响应的名称。如果系统完全无法识别该命令,则当前会话不支持跨会话消息传递,任何设置文件都无法启用该功能。输入 /status,查找 Peer address 行:该行包含当前会话自己的收件箱地址,地址前带有 uds:。

VPS 用户尤其容易遇到一个问题。跨会话消息传递依赖功能标志评估,而多个隐私变量会关闭该评估,使该功能保持默认关闭状态。DO_NOT_TRACK、DISABLE_TELEMETRY、CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 和 DISABLE_GROWTHBOOK 都会产生这种效果。用户通常会将这些变量粘贴到新服务器的 ~/.bashrc 中进行加固,之后却发现 /list-agents 不存在。相同的值也可能来自设置文件中的 env 映射或托管设置,因此应先检查 shell 环境。

env | grep -E 'DO_NOT_TRACK|DISABLE_TELEMETRY|DISABLE_GROWTHBOOK|NONESSENTIAL'

取消设置输出结果中的变量。对于 DISABLE_TELEMETRY 和 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC,任何非空值都会启用该行为,包括字符串 0,因此 DISABLE_TELEMETRY=0 并不会产生表面上看似的效果。要关闭该行为,请取消设置变量,或将其设置为空字符串。

为会话命名,否则 Claude 无法定位会话

Claude 通过会话名称向会话发送消息。启动会话时设置名称:

claude --name builder-api

在运行中的会话内,也可以使用 /rename 设置名称。如果不设置名称,Claude Code 会根据工作目录的文件夹名称生成名称,例如 myapp-3f。一个会话使用时没有问题,但同时运行四个会话时容易混淆,而且两个会话可能获得相同的名称。/list-agents 输出每个本地会话的工作目录,可用于区分名称相同的会话;名称冲突时,Claude 自己的列表还会在地址中加入短标识符。自行命名比查找标识符更省事。

可复现的双会话 tmux 布局

这是在同一代码库中运行的构建会话和审查会话。审查会话使用单独的 Git worktree,因此两个会话不会写入同一个文件。git worktree add 配合 HEAD 可创建一个分离的检出,这适合只读取代码而不提交更改的会话。由于两个会话执行不同的任务,最好为审查会话单独设置输出样式。这样会修改该会话的系统提示词,并在每一轮中持续生效,而不是像只输入一次的指令那样逐渐失效。

cd ~/src/api
git worktree add ../api-review HEAD
tmux new-session -d -s agents -n builder -c ~/src/api
tmux new-window -t agents -n reviewer -c ~/src/api-review
tmux send-keys -t agents:builder 'claude --name builder-api' C-m
tmux send-keys -t agents:reviewer 'claude --name reviewer-api' C-m
tmux attach -t agents

Ctrl+b 配合 w 会按名称列出窗口,方便您选择目标窗口。在构建窗口中运行 /list-agents。您应看到 reviewer-api,其工作目录为 ~/src/api-review。如果看不到,说明审查会话尚未完成启动,或者下一节中的两个问题之一适用。然后用自然语言交接任务:

Tell reviewer-api which files I changed for the rate limiter and what to look at first.

Claude 会编写摘要并发送。您不需要编写消息内容,而且 Claude 发送的内容并不固定。在审查窗口中,消息会以发送者名称显示在对话中。如果该会话处于空闲状态,Claude 会立即在其中开始新一轮处理。如果该会话正在处理当前轮次,消息会等待到两次工具调用之间,因此不会中断正在运行的命令。Claude 读取消息后,消息会折叠为一行 Message from,并由 Ctrl+O 展开。构建会话的更改越小,两个会话的配合效果越好:较小的差异会产生更短的交接内容,也更容易让另一个会话在一轮中完成审查。这正是懒惰高级开发者技能要培养的习惯。

同一 VPS 上谁能看到谁

同一台机器上的消息投递不会经过 Anthropic 服务器。每个会话都会将注册文件写入磁盘,并绑定自己的收件箱套接字;Claude Code 读取这些文件来查找其他会话。这会带来两个后果,而且在服务器上都很重要。

套接字仅限您的操作系统用户访问。您以 root 启动的会话和以 deploy 启动的会话无法互相发现,即使它们并排运行在同一个 tmux 服务器中也是如此,因为一个用户的会话无法访问另一个用户的套接字。请让两个会话以同一个用户运行。

容器使用独立的文件系统。Docker 内的会话与主机上的会话无法互相访问,因为它们读取的注册文件不同。同一容器内的两个会话可以正常互发消息。如果您像在一次性 VM 中运行编码代理这样使用容器隔离代理,应预期消息传递只能在容器内工作,无法跨越容器边界。

其他机器上的会话以及 Web 上的会话,只有在 Remote Control 已连接时才会出现在列表中,并会标记为相应来源。此处的 Claude 只能回复来自其中某个会话的消息,无法主动发起这类通信。

为什么您的消息始终未送达

通常原因与网络无关。接收会话决定如何处理消息,但决定是不投递。每条到达的消息最终只有3种结果:已送达、已暂存(暂不送达,直到您批准),或已拒绝(直接丢弃,不予送达)。

当没有适用的 crossSessionInbound 值时,Claude Code 会根据两个会话的权限模式逐条决定。它会将绕过权限提示的会话归为一类,将其他会话归为另一类。auto、acceptEdits 和 dontAsk 都属于需要提示的模式。在具有可用绕过权限的会话中,计划模式属于绕过权限提示。如果您不确定某个会话属于哪一类,建议先阅读各权限模式的实际行为,因为大多数会话现在都从 auto 模式开始,而 auto 位于这个划分中需要提示的一侧。规则是对称的:

  • 需要权限提示的接收会话会投递每条消息。只有当发送会话表明自己绕过权限提示时,它才会暂存消息。
  • 绕过权限提示的接收会话会暂存所有消息,等待您批准。只有当发送方也绕过权限提示时,它才会投递消息。

因此,大多数人首先构建的工作流恰好无法正常工作。您使用 --permission-mode bypassPermissions 启动构建器,因为希望它无人值守地运行;但审查器仍使用默认设置,于是构建器发送的每条消息都会停留在无人查看的批准对话框中。该对话框会在 dialogExpiry 超时期限后关闭,默认期限为 5m,消息随后被丢弃。在同一台计算机上,发送会话会在其消息被暂存时收到通知;接收方稍后投递、拒绝或使消息过期时,发送会话还会收到后续通知。因此,在指责 socket 之前,请先查看发送方屏幕。

要让会话在无人值守的情况下接收消息,请将 crossSessionInbound 设置为 accept。设置位置决定了它的生效范围。Claude Code 会先读取托管设置,然后读取 --settings 标志,最后读取用户设置,并采用找到的第一个值。项目设置或本地设置中的值只有在更严格时才会生效,其等级顺序为 accept < hold < refuse。.claude/settings.json 中的 accept 比任何值都宽松,因此只要受信任的来源已设置值,它就会被忽略。将其写入 ~/.claude/settings.json,或仅为一个会话传入:

claude --name runner --settings '{"crossSessionInbound":"accept"}'

无头 claude -p 工作进程会像交互式会话一样绑定 inbox socket,并显示在列表中,但无法显示批准对话框。其中暂存的消息会一直保持暂存状态,直到后续的模式或设置变更允许其接收。上面的 --settings 行就是让此类工作进程接收消息的方法。以 bare 模式启动的会话完全不会绑定 socket,因此既不能接收消息,也不会显示在列表中。

交接何时会僵持

消息循环由系统处理。Claude Code 会按发送方限制重复消息的频率,丢弃在短时间窗口内到达的相同重复消息,并将每个会话中等待读取的已接受消息限制为 50 条,因此两个会话无法无限互相发送消息。暂存消息上限为 100 条,超过后会丢弃最早的消息。

实际发生的故障更隐蔽,属于交接问题,而不是循环。会话 A 向会话 B 提出一个问题,只有得到答案后才能继续,然后进入空闲状态。B 可能暂存了消息,可能正在处理耗时较长的任务,也可能回答了一个 A 实际上没有提出的问题。A 一直等待。您一小时后回来时,会看到两个空闲会话,却没有完成任何工作。

编写不需要回复的交接消息。好的消息应包含事实或决定:发生了什么变化,以及结果是什么。坏的消息会向另一个会话请求许可,或请求发送方必须依赖的答案才能继续。Claude 已被告知,如果某项操作会被自身的权限设置阻止,绝不要向另一个会话请求执行该操作,而应将任务交回给您。您还应自行扩展这条规则。如果某个会话没有答案就无法继续,应由您提供答案。保持上下文清晰也有帮助,因为丢失上下文的会话容易写出含糊的消息;在 Claude Code 中管理上下文介绍了这一方面。

将传入消息视为不可信输入

Claude Code 会告诉接收消息的 Claude:该消息来自另一个会话,而不是您本人,并限制该消息可以执行的操作。这种限制由模型外层的程序实施,而不是依赖模型自行决定是否遵从;这正是代理控制框架带来的实际差异。消息不能代替您响应待处理的权限提示,因为另一个会话的同意不等于您的同意。消息也不能因为另一个会话提出要求,就更改权限设置、CLAUDE.md或其他配置。文本中的斜杠命令(例如 /compact)会作为普通文本传入,绝不会执行。如果处理消息需要接收会话尚未拥有的权限,您会看到与执行其他操作时相同的提示。在自动模式下,分类器还会在每条消息传送前进行检查,被阻止的消息不会到达接收方。这些限制在宽松模式下仍然有效。因此,绕过限制的会话默认会暂存传入消息,而不会信任这些消息。

这解决的是权限问题,不是内容问题。发送会话可能读过拉取请求描述、网页、依赖项 README,或陌生人撰写的问题评论;它读到的任何内容都可能影响它写给您另一个会话的文本。消息是数据。对它的警惕程度应与对从外部进入会话的其他文本相同。这就是避免将机密信息交给 AI 代理所描述的原则:假设任何跨越信任边界的内容都可能有误,绝不允许内容自行授予权限。

如果您希望减少这类消息,可以使用以下两个控制项。将 crossSessionInbound 设置为 refuse 后,传入的对等会话消息会被丢弃,不会传送;如果该值来自项目设置或本地设置,则优先级高于其他所有来源,因为它在优先级梯度中最严格。若要阻止当前会话发送或列出消息,请添加分别指向 SendMessage 和 ListAgents 的拒绝规则;两者都应写成不带限定符的纯工具名称。将 isolatePeerMachines 设置为 true 后,任何消息发送到本机之外的会话前都必须获得您的明确批准;即使处于 bypassPermissions 模式,也必须批准。

{
  "crossSessionInbound": "refuse",
  "isolatePeerMachines": true
}

拒绝 SendMessage 也会禁止向子代理发送消息,因为两者使用同一个工具。拒绝发送的会话不会在自身的 /status 或其他会话的列表中显示任何可见变化。因此,应从会话配置中确认该设置,而不要只根据界面判断。

Bridge 和共享内存 MCP 服务器

同一时期还出现了几个相关的第三方项目:在运行中的代理之间转发文本的本地代理间 Bridge,以及让多个代理共享读写存储的 MCP(模型上下文协议)服务器。应将它们视为不同形态的方案,而不是竞争产品。运行任何安装命令前,都应先根据项目自己的 README 进行核对。消息传递属于推送,因为发送方会将文本放入接收方当前的交互轮次。共享存储属于拉取,因为它不会中断任何会话,会话下次查看时才能看到这条记录。对于变化较慢的状态,拉取方式更平稳;但只有会话实际查看时,它才会生效。

如果选择这类方案,值得关注的问题应围绕进程,而不是功能列表。服务器以哪个用户身份运行?它可以读取主机上的哪些内容?在 VPS 上运行 MCP 服务器介绍了相关配置。在多个代码仓库之间共享代理技能介绍了更简单的场景:如果希望在多个会话之间共享的是指令而不是实时状态,这种方式可以减少许多原本需要发送的消息。要了解更广泛的背景,请从在 VPS 上运行代码代理开始。

FAQ

为什么在我的会话中无法识别 /list-agents?

该会话不支持跨会话消息传递。先检查 claude --version 是否为 2.1.224 或更高版本,因为此功能需要该版本或更高版本。然后检查运行平台,因为该功能支持 macOS 和 Linux,不支持原生 Windows;Amazon Bedrock、AWS 上的 Claude Platform、Google Cloud 的 Agent Platform 和 Microsoft Foundry 也不支持该功能。如果这两项都正常,请检查 shell 中是否设置了 DO_NOT_TRACK、DISABLE_TELEMETRY、CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 或 DISABLE_GROWTHBOOK,因为这些设置都会阻止功能标志评估,使该功能保持关闭状态。

为什么我发送到另一个会话的消息始终没有送达?

如果 /list-agents 正常工作,说明消息传递已启用,问题出在更具体的限制上。最常见的原因是权限模式。绕过权限提示的会话会暂存所有传入消息,等待您批准,除非发送方也绕过权限提示。该批准对话框会在 dialogExpiry 后丢弃,默认期限为五分钟。检查发送方会话中是否显示了暂存通知。要修复此问题,请在 ~/.claude/settings.json 中将 crossSessionInbound 设置为 accept,或通过 --settings 传入该设置,因为项目设置或本地设置中的 accept 会被忽略,较宽松的值不会生效。

Docker 中的 Claude Code 会话可以向主机上的会话发送消息吗?

不可以。会话通过磁盘上的注册文件和每个会话专用的 inbox socket 互相发现,而容器拥有独立的文件系统,因此两个会话无法访问同一组文件。同一容器中的两个会话可以正常互发消息。这也解释了为什么以 root 身份运行的会话无法访问以普通用户身份运行的会话:该 socket 仅限其所属的操作系统用户使用。

来自其他 Claude Code 会话的消息可以安全执行吗?

应将消息文本视为不可信输入,因为发送方会话可能读取过网页、README 或他人撰写的 issue 评论。Claude Code 已阻止消息自行执行操作:它不能批准待处理的权限提示,不能根据消息请求更改权限设置或 CLAUDE.md,消息中的斜杠命令会以纯文本形式到达,绝不会执行。这些保护措施涵盖权限控制,不涵盖判断过程,因此请先阅读收到的内容,再指示接收会话执行操作。

跨会话消息传递会将我的代码发送给 Anthropic 吗?

如果两个会话位于同一台机器上,不会。消息通过该机器上的每个会话专用 socket 传输,不会经过 Anthropic 服务器;发送的只有 Claude 编写的文本,不会发送对话历史或文件。向另一台设备上的会话或 Web 上的会话发送消息时,消息会通过 Remote Control 连接经由 Anthropic 服务器传输;在这种方向上,Claude 只能回复已收到的消息,不能主动发起消息。将 isolatePeerMachines 设置为 true,即可要求您批准任何离开本机的内容。