Claude Code OAuth 网址复制不了怎么办:SSH 显示 Sent via OSC 52,Mac 剪贴板却是空的
Claude Code OAuth 网址复制不了,可能是全屏界面通过 OSC 52 发送剪贴板,终端没收到。把 tui 设成 default 改回传统界面就能自己选取;授权后连不回 localhost 是另一个问题。
本文目录
在 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 会按官方文档的规则自己选界面。
延伸阅读
- Claude Code 中文入门:安装、CLAUDE.md、skills、hooks 与权限,看不懂代码也能上手Claude Code 教程:需要 Pro、Max 等付费套餐,免费套餐不能用;装好先设置 CLAUDE.md 和权限,指令用到再学。另整理三种安装方式、skills、hooks、MCP 与常见的坑。
- CLAUDE.md 怎么写?一个多语内容网站的实际规则与写法CLAUDE.md 怎么写:写每次对话都要记得的事,包括命令、项目结构、不能违反的规则和何时先问人。附 Anthropic 官方要点、Jason Finance 实例与可复制模板。
- 看不懂代码也能建网站:我用 Claude Code + GitHub + Cloudflare 低成本搭建 Jason Finance 的方法与成本Claude Code 建网站:主机和数据库可以全用免费方案,固定支出主要是域名和 Claude 订阅。整理 Jason Finance 用 GitHub、Cloudflare、Supabase 的架构、费用与限制。

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