OSC 52 — 系统剪贴板读写
通过终端设置(或查询)宿主系统剪贴板 —— 可跨 SSH 工作,无需 X11 转发。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b]52;c;BASE64\x07 (set clipboard 'c' to BASE64 decoded bytes)\\033[
\033]52;c;BASE64\007\\e[
\e]52;c;BASE64\aESC [
ESC ] 52 ; SELECTION ; PAYLOAD BELhex
1b 5d 35 32 3b ... 07说明
通过终端输出来设置系统剪贴板。第一个参数为选择区:`c` = CLIPBOARD、`p` = PRIMARY、`s` = secondary、`q` 或 `0..9` 为剪切缓冲区。第二个参数为 base64 编码的字节;若改写为字面 `?`,终端会回报当前剪贴板内容(`\x1b]52;c;BASE64\x07`)。`tmux set -g set-clipboard on`、`vim`(`clipboard=unnamedplus,osc52`)、`neovim`(`vim.g.clipboard`)以及 `yazi --copy` 都依靠此机制在 SSH 下完成跨主机复制。出于安全考虑(恶意日志行可改写剪贴板)大多数终端默认禁用,需要在终端设置中显式开启。
规范出处: xterm-ctlseqs (OSC 52)
示例
printf '\033]52;c;%s\007' "$(printf 'hello' | base64)"import sys, base64\npayload = base64.b64encode(b'hello').decode()\nsys.stdout.write(f'\x1b]52;c;{payload}\x07')import "encoding/base64"\nfmt.Printf("\x1b]52;c;%s\x07", base64.StdEncoding.EncodeToString([]byte("hello")))process.stdout.write('\x1b]52;c;' + Buffer.from('hello').toString('base64') + '\x07')/* assumes base64_encode() helper */\nprintf("\x1b]52;c;%s\x07", base64_encode("hello", 5));终端支持
- xterm
- 支持
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 支持
- Windows Terminal
- 部分
- cmd.exe / ConPTY
- 不支持
- kitty
- 支持
- alacritty
- 支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 部分
- Konsole
- 支持
- tmux
- 不支持
- GNU screen
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 支持 | 部分 | 不支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 不支持 | 不支持 |