SGR 8 — 隐藏 / 不可见
将后续文本渲染为不可见(光标仍前进)。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[8m\\033[
\033[8m\\e[
\e[8mESC [
ESC [ 8 mhex
1b 5b 38 6d说明
将前景色设为与背景色视觉一致 —— 文本仍占据单元格,并可通过 全选/复制 保留。可用于剧透标签或类似密码风格的隐藏显示,但不是安全特性:文本可被复制。使用 \x1b[28m 关闭。多数现代终端支持;Linux console 与 ConPTY 视为空操作。
规范出处: ECMA-48 §8.3.117 (SGR parameter 8)
示例
printf 'password: \033[8mhunter2\033[28m (select to reveal)\033[0m\n'print('\x1b[8mhidden\x1b[0m')fmt.Print("\x1b[8mhidden\x1b[0m")console.log('\x1b[8mhidden\x1b[0m')printf("\x1b[8mhidden\x1b[0m\n");常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 为什么
\x1b[8m隐藏的文本被复制出来后又能看到? - Conceal 隐藏的是*渲染出来的字形*——文本字节仍在终端的单元格缓冲区里,选择 / 复制读的是这块缓冲区,而不是屏幕上画出来的像素。终端截屏工具(屏幕抓取器、无障碍读屏、
tmux capture-pane)也一样。把 SGR 8 当作*显示*层的混淆,绝不是安全边界——CTF 式的隐藏 flag 没问题,但密码或机密绝不可用。 \x1b[8m能在script或asciinema录像里保留下来吗?- 可以——两者录的都是程序发出的原始字节流,包含 SGR 8。回放到尊重 conceal 的终端会在屏幕上隐藏;把录像
cat -A或sed 's/\x1b\[[0-9;]*m//g'后底层字节会暴露。SGR 8 是渲染期指令,不是存储期变换。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 支持 | 支持 | 支持 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |