前言
最近试图用Python 实现一个 SSH Terminal,数据的发送不难,问题出在对象的返回值上,在执行某些命令的时候会返回一些 类似“x1b[22;34H\x1b[1K \x1b” 的数据。
略微做了点研究,这些数据是Terminal的一种控制指令,代表了诸如颜色,提示音,清屏,光标移动 等等含义。这里对找到的资料做了一个小结。
控制字符及转义字符通常会直接执行而不显示在终端屏幕上,但如果要自己写一个类似终端的控制,则需要对这些转义字符进行妥善处理。丢弃或者按其本意创建相应函数。
ANSI
其原名叫AESC,后更名为ANSI, ECMA-48 是ANSI 的第一个标准,后改为支持ISO 6429国际标准,其大体内容是一样的。本文例举的字符命令基本以ECMA-48为准,可能有部分存在偏差(在不同的标准下部分指令不兼容)。
ANSI 主要用来控制终端上的光标位置,颜色及其他选项。
控制字符
Hex | 字符 | 描述 |
---|---|---|
\x00 | \0 | Null |
\x05 | ENQ 触发应答消息 | |
\x07 | \a | Bell 响铃,当你在terminal中做某些无效操作的时候,返回\x07 |
\x08 | \b | BackSpace 退格键(发送退格键,if 在行首返回\x07 else 返回\x08\x1b[K,具体含义见后续) |
\x09 | \t | Horizontal Tab 横向跳至下一个制表位,若后面没有制表位,则跳至行尾 |
\x0a | \n | Line Feed 光标下移一行(终端中表现为换行) |
\x0b | \v | Vertical Tab 竖向跳至下一个制表位(终端中表现为换行) |
\x0c | \f | Form Feed 光标跳转至下一页头部(终端中表现为换行) |
\x0d | \r | Carriage Return 回车换行 |
\x0e | SO 激活 G1 字符集 | |
\x0f | SI 激活 G0 字符集 | |
\0x11 | \q | DC1 继续传送 |
\0x13 | \s | DC3 忽略除XOFF 和 XON 以外的一切字符 |
\x18 | CAN 实质 Ctrl+X 中断转义序列/进程 | |
\x1a | \z | SUB(EOF) 实质 Ctrl+Z 中断转义序列/进程 |
\x1b | \e | Escape 开始一个新的转义序列 |
\x7f | DEL 忽略 | |
\x9b | CSI 控制序列;等同于 ESC[ (\x1b[) |
ESC 非转义控制序列
ESC | 描述 | |
---|---|---|
\x1bc | RIS | 重绘屏幕,清屏,类似linux命令clear(注意大小写) |
\x1bD | IND | 光标下移一行,不改变其列 |
\x1bE | NEL | 换新的一行,类似 ‘\n’ |
\x1bH | HTS | 设置当前列为制表位,类似 ‘\t’ |
\x1bM | RI | 反转换行,光标上移一行,不改变其列 |
\x1bZ | DECID | DEC私有定义,ubuntu内核释义为返回字符ESC[?6c |
\x1b7 | DECSC | 存储当前状态(光标位置,属性,字 |