跳到主要内容
ansicode

SGR 8 — 隐藏 / 不可见

将后续文本渲染为不可见(光标仍前进)。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[8m
\\033[\033[8m
\\e[\e[8m
ESC [ESC [ 8 m
hex1b 5b 38 6d

说明

将前景色设为与背景色视觉一致 —— 文本仍占据单元格,并可通过 全选/复制 保留。可用于剧透标签或类似密码风格的隐藏显示,但不是安全特性:文本可被复制。使用 \x1b[28m 关闭。多数现代终端支持;Linux console 与 ConPTY 视为空操作。

规范出处: ECMA-48 §8.3.117 (SGR parameter 8)

示例

bash
printf 'password: \033[8mhunter2\033[28m (select to reveal)\033[0m\n'
python
print('\x1b[8mhidden\x1b[0m')
go
fmt.Print("\x1b[8mhidden\x1b[0m")
javascript
console.log('\x1b[8mhidden\x1b[0m')
c
printf("\x1b[8mhidden\x1b[0m\n");

常见问题

针对这条序列,开发者真正会去搜索的问题的简短回答。

为什么 \x1b[8m 隐藏的文本被复制出来后又能看到?
Conceal 隐藏的是*渲染出来的字形*——文本字节仍在终端的单元格缓冲区里,选择 / 复制读的是这块缓冲区,而不是屏幕上画出来的像素。终端截屏工具(屏幕抓取器、无障碍读屏、tmux capture-pane)也一样。把 SGR 8 当作*显示*层的混淆,绝不是安全边界——CTF 式的隐藏 flag 没问题,但密码或机密绝不可用。
\x1b[8m 能在 scriptasciinema 录像里保留下来吗?
可以——两者录的都是程序发出的原始字节流,包含 SGR 8。回放到尊重 conceal 的终端会在屏幕上隐藏;把录像 cat -Ased '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
支持

相关序列