跳到主要内容
Jason Finance
AI 创业

Claude Code OAuth 网址复制不了怎么办:SSH 显示 Sent via OSC 52,Mac 剪贴板却是空的

Claude Code OAuth 网址复制不了,可能是全屏界面通过 OSC 52 发送剪贴板,终端没收到。把 tui 设成 default 改回传统界面就能自己选取;授权后连不回 localhost 是另一个问题。

本文目录
  1. 1.Claude Code OAuth 网址复制不了:先分清是哪一种问题
  2. 2.为什么显示 Sent via OSC 52,剪贴板却是空的
  3. 3.解决方法:把 tui 设成 default,改回传统界面
  4. 3.1最简单的做法:在 Claude Code 里运行 /tui default
  5. 3.2我实际用的做法:备份后只改 tui 这个字段
  6. 3.3重启 Claude Code,再登录一次
  7. 4.不改设置的其他做法
  8. 5.授权后连不回 localhost:callback 要另外处理
  9. 6.怎么还原
  10. 7.改之前要知道的事
  11. 常见问题

在 Mac 的 Terminal 用 SSH 连到 Linux 主机,在主机上运行 Claude Code,再用 /mcp 给一个需要 OAuth 的 MCP 服务器登录。Claude Code 打印出一段很长的授权网址,下面写着 Sent via OSC 52,可是 Mac 的剪贴板里什么都没有,网址又折成好几行,用鼠标也选不中。2026 年 10 月,我在 Oracle Cloud 的 VM 上通过 SSH 运行 Claude Code,给 Supabase MCP 登录(/mcp → Authenticate)时,就卡在了这个 Claude Code OAuth 网址复制的问题上。下面的 tui 设置和 callback 的处理跟是哪个 MCP 无关,用 OAuth 登录的 MCP 都适用。

先说结论:在运行 Claude Code 的远程用户的 ~/.claude/settings.json 里加入 "tui": "default",重启 Claude Code,我原本复制不了的 OAuth 网址就能正常复制了。 tui 是官方文档列出的设置,default 表示改回传统界面(在 Claude Code 里运行 /tui default 也会写入同一个设置)。授权完成后浏览器连不回 localhost,则是另一个问题,要靠粘贴回 callback 网址或 SSH 端口转发来处理。

本文是我 2026 年 10 月在 Oracle Cloud 的 Ubuntu 主机上、从 macOS 的 Terminal 通过 SSH 操作时的记录,加上 Claude Code 官方文档、Claude Code changelog、xterm 与 OpenSSH 文档的整理(2026 年 10 月 14 日查阅;当天这台主机上的 Claude Code 是 2.1.296 版)。"tui": "default" 能解决复制问题,是我在自己环境里的实测结果,不保证每个 Claude Code 版本、终端或 SSH 配置都适用。文中的 MCP 名称、用户和端口都是示例;真实的授权网址、callback 网址、授权码和 token 都不要发给别人。

Claude Code OAuth 网址复制不了:先分清是哪一种问题

我当时看到的界面大致是这样(网址省略):

Authenticating with my-server...
If your browser doesn't open automatically, copy this URL manually
(Sent via OSC 52 · select the URL manually if paste fails)
https://example.com/oauth/authorize?...

这里其实是两个问题,常被混为一谈,处理方式完全不同:

卡在哪里 看到的情况 要处理的是
复制网址 显示 Sent via OSC 52,Mac 粘贴出来是空的;网址跨好几行,选不中 终端界面和剪贴板,见下面两节
授权后回调 网址已经在浏览器打开、也点了同意,最后浏览器连不上 localhost:<端口>/callback OAuth callback 的网络路径,见后面的 callback 一节

我一开始先配置了 SSH 端口转发,结果网址还是复制不了。端口转发处理的是 callback 的网络路径,不会把东西放进剪贴板。

为什么显示 Sent via OSC 52,剪贴板却是空的

OSC 52 是终端的一组控制码。根据 xterm 的控制码规范,程序把要复制的内容用 base64 编码后发给终端,由终端写进剪贴板;终端也可以关掉这个功能。也就是说,远程的 Claude Code 只负责“发送”,剪贴板有没有收到,要看你本机的终端。

Claude Code 官方的全屏界面文档写到几件和这个问题有关的事:

  • 全屏界面(fullscreen rendering)会接管鼠标,终端原本的“拖动选取、复制”改由 Claude Code 自己处理。
  • 本机运行时,Claude Code 用系统工具写剪贴板(macOS 是 pbcopy);通过 SSH 时改用 OSC 52。
  • 有些终端默认会拦截 OSC 52,例如 iTerm2 要先打开设置才会允许。
  • 没有设置 tui 时,Claude Code 按一张规则表决定用哪种界面;例如会向 Anthropic 获取功能开关、而且在 2026 年 5 月 6 日以后才第一次使用 Claude Code 的人,默认就是全屏界面。

macOS 的 Terminal 支不支持 OSC 52,我没有找到 Apple 的官方说明。我能确定的是自己看到的结果:界面显示已经用 OSC 52 发送,Mac 剪贴板却没有收到。 改回传统界面之后,选取交还给终端自己处理,我就能直接选取、复制网址。这个因果是我根据官方文档的推断,官方没有针对这个场景写明。

解决方法:把 tui 设成 default,改回传统界面

Claude Code 设置参考对 tui 的说明是:选择终端界面的绘制方式,取值只有两个。根据 Claude Code changelog,/tui 命令和 tui 设置在 2.1.110 版加入。

tui 的值 意思
"fullscreen" 全屏界面:不闪烁、支持鼠标,选取由 Claude Code 处理
"default" 传统界面:对话留在终端原本的滚动记录里
没有设置 由 Claude Code 按官方规则自己选

以下步骤都在实际运行 Claude Code 的那个 Linux 用户下操作,不是管理员账号。用 sudo -iu 切换用户的话,先用 whoami 确认。

最简单的做法:在 Claude Code 里运行 /tui default

官方文档说明,/tui default 会切回传统界面并写入 tui 设置,对话内容会保留。运行 /tui 不带参数,可以查看当前用的是哪种界面。

我实际用的做法:备份后只改 tui 这个字段

我是直接改配置文件。~/.claude/settings.json 里如果已经有权限之类的其他设置,不要整个覆盖。下面这段只新增或更新 tui,改之前先备份:

python3 - <<'PY'
import json
import shutil
from datetime import datetime
from pathlib import Path

p = Path.home() / '.claude/settings.json'
p.parent.mkdir(parents=True, exist_ok=True)

data = json.loads(p.read_text()) if p.exists() else {}

if p.exists():
    backup = p.with_name(f'settings.json.bak-{datetime.now():%Y%m%d-%H%M%S}')
    shutil.copy2(p, backup)
    print('Backup:', backup)

data['tui'] = 'default'
p.write_text(json.dumps(data, indent=2, ensure_ascii=False) + '\n')
print('Updated:', p)
PY

确认文件还是合法的 JSON,并读出 tui 的值:

python3 -m json.tool ~/.claude/settings.json >/dev/null && \
python3 -c 'import json,pathlib; print(json.loads((pathlib.Path.home()/".claude/settings.json").read_text()).get("tui"))'

预期输出是 default。

重启 Claude Code,再登录一次

在交互中的 Claude Code 输入 /exit,再运行 claude 重新启动。进入 /mcp,选要登录的服务器,按 Authenticate,让它生成新的授权网址,再试一次复制。

我只重启了终端里的 Claude Code,没有为这件事重启 systemd 常驻的 Remote Control 服务。

不改设置的其他做法

下面几种做法来自官方文档或工具文档,我没有每一种都实测过:

做法 适合 出处
在 Terminal 按住 Fn 拖动选取 偶尔一次,想保留全屏界面 Claude Code 全屏界面文档:按住这个键,选取交给终端处理,Cmd+C 可以用(iTerm2 是 Option)
启动时加 CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1 只有这一次用传统界面 Claude Code 设置参考:这个环境变量在单次 session 中优先于 tui 设置
改用 iTerm2,打开允许程序访问剪贴板 想让 OSC 52 正常工作 Claude Code 文档:Settings → General → Selection → Applications in terminal may access clipboard,在 iTerm2 运行 /terminal-setup 会替你打开
在 shell 运行 claude mcp login <名称> 不想在 /mcp 界面里处理 Claude Code MCP 文档:检测到没有本机浏览器(例如 SSH)时直接打印授权网址,再把浏览器的完整 redirect 网址粘贴回来;要用 ssh -t 连接,--no-browser 可强制使用这个流程

如果在 tmux 里运行 Claude Code,tmux 也会经手剪贴板控制码。根据 tmux 手册,set-clipboard 设成 off 时,tmux 既不接受也不转发这个控制码。不过外层终端本身不支持 OSC 52 的话,改 tmux 设置也没用。

授权后连不回 localhost:callback 要另外处理

网址成功复制、在 Mac 的浏览器打开也点了同意之后,OAuth 会把浏览器重定向到 http://localhost:<端口>/callback。这个 localhost 指的是 Mac 自己,Claude Code 却在 VM 上等着,所以浏览器可能显示连接失败。

Claude Code 的 MCP 文档写了两件事:

  • callback 端口默认随机挑一个可用的;要固定的话,添加服务器时用 --callback-port。
  • 浏览器重定向失败时,把地址栏里完整的 callback 网址粘贴进 Claude Code 显示的网址输入框。

我那次也在 Mac 另开一个终端,按界面上 redirect_uri 的端口建立 SSH 转发,例如:

ssh -N -L 57038:127.0.0.1:57038 my-vm

57038 只是示例,每次登录的端口可能不同,要以当次 redirect_uri 为准;my-vm 换成你 SSH 配置里的主机名。根据 OpenSSH 手册,-L 把本机的端口转发到远程,-N 表示不执行远程命令,所以这行运行后会停在那里、不出现提示符,这是正常的。

在 Claude Code 的网址输入框里,要粘贴浏览器地址栏里完整的 callback 网址,不要在输入框里按复制的快捷键。

怎么还原

改回去有两种方式:

  • 在 Claude Code 里运行 /tui fullscreen,切回全屏界面。
  • 从配置文件删掉 tui 字段、保留其他设置,让 Claude Code 自己选:
python3 - <<'PY'
import json
from pathlib import Path
p = Path.home() / '.claude/settings.json'
data = json.loads(p.read_text())
data.pop('tui', None)
p.write_text(json.dumps(data, indent=2, ensure_ascii=False) + '\n')
print('Removed tui from', p)
PY

改完同样要重启 Claude Code。前面备份的 settings.json.bak-日期时间 也可以直接拿来还原整个文件。

改之前要知道的事

  • 这是用户级别的设置:~/.claude/settings.json 会影响这个 Linux 用户之后启动的所有 Claude Code,不只是眼前这个项目。根据官方文档,从 agent view 或 claude attach 打开的后台 session 一律用全屏界面,不受 tui 影响。
  • 它只改界面:tui 和 MCP 的授权、权限或连接到哪个账号都无关。登录成功后,执行会写入数据的操作之前,还是要确认 MCP 实际连接的是哪个账号、哪个项目。
  • 不要公开授权相关的网址:授权网址、callback 网址、授权码和 token 都不要贴到聊天、issue 或截图里。

主机怎么搭、Remote Control 怎么做成常驻服务,见《Oracle Cloud 运行 Claude Code Remote Control 常驻教程》;同一台主机的其他错误,见《Remote Control exit code 1》《systemctl –user No medium found》《Claude Code ARM64 安装》。刚开始用 Claude Code 的话,可以先看《Claude Code 中文入门》;整个系列在 AI 创业主题页。

常见问题

Claude Code 显示 Sent via OSC 52,为什么剪贴板里没有东西?

OSC 52 是终端的剪贴板控制码,要你本机的终端支持并允许,才会把内容写进剪贴板。Claude Code 官方文档写明,通过 SSH 时复制会改用 OSC 52,而且有些终端默认会拦截它。我在 macOS 的 Terminal 通过 SSH 遇到的情况是:界面显示已发送,Mac 剪贴板却是空的。

settings.json 里的 tui 是什么设置?

tui 是 Claude Code 官方文档列出的设置,用来选择终端界面的绘制方式:fullscreen 是全屏界面,default 是传统界面。在 Claude Code 里运行 /tui default 或 /tui fullscreen 会替你写入这个设置;changelog 写明它在 2.1.110 版加入。

把 tui 设成 default 一定能复制 OAuth 网址吗?

不保证。这是我在自己的环境实测有效的做法:在远程用户的 settings.json 加入 tui: default,重启 Claude Code 后,原本复制不了的 OAuth 网址就能正常复制。换成其他 Claude Code 版本、终端或 SSH 配置,要自己测试。

OAuth 授权后浏览器连不上 localhost 怎么办?

这和复制网址是两个问题。官方文档的做法是把浏览器地址栏里完整的 callback 网址,粘贴回 Claude Code 显示的网址输入框;也可以在 Mac 另开一个终端,用 ssh -L 把当次 redirect_uri 的端口转发到 VM。端口每次可能不同,要看当次界面。

连接 Supabase MCP 也适用吗?

适用。我就是在 Oracle Cloud 的 VM 上通过 SSH 给 Supabase MCP 登录(/mcp → Authenticate)时遇到这个问题。tui 设置和 callback 的处理跟是哪个 MCP 无关,其他用 OAuth 登录的 MCP 也一样。tui 只改界面;登录成功后,执行会写入数据的操作之前,还是要确认 MCP 实际连接的是哪个账号、哪个项目。

改了 tui 之后想恢复全屏界面怎么做?

在 Claude Code 里运行 /tui fullscreen,或从 settings.json 删掉 tui 这个字段、保留其他设置,再重启 Claude Code。删掉字段后,Claude Code 会按官方文档的规则自己选界面。

延伸阅读

关于作者

Jason 的照片

Jason

Google 大客户销售客户经理、哥伦比亚大学 MBA 录取者,分享自己实际用过的理财工具与经验。

留言

使用 Google 登录即可留言。留言“不会”使用您的 Google 头像或姓名,对外显示的昵称是系统随机生成的代号,以保护您的隐私。

登录即表示你同意本站的隐私政策。

  1. 加载留言中…