DarkMatter in Cyberspace
  • Home
  • Categories
  • Tags
  • Archives

关于ansi转义序列控制符


颜色控制符

现象

Telnet发送ls指令收到的目录名(此目录名为2.1,用粗体标出):

<ESC>[00m<ESC>[01;34m 2.1 <ESC>[00m

对应的原始字节流是(16进制):

1b 5b 30 30 6d 1b 5b 30 31 3b 33 34 6d 32 2e 31 1b 5b 30 30 6d

解释

这些正文前后奇怪的字符序列是 ANSI escape sequence , 也就是为了在 字符终端 (俗语所云的“命令行窗口”)上显示控制格式、字体颜色等东西, 由 ANSI 制定的,服务器发送给 终端 的字符序列定义,例如下图中为了区别文件和目录, 服务器将文件名的颜色设为白色,而将目录名(Desktop)设为蓝色,

终端收到原始报文

anaconda-ks.cfg<SPACE><SPACE><ESC>[00m<ESC>[01;34mDesktop<ESC>[00m<SPACE><SPACE>install.log

后,按照ANSI标准解释其中的转义序列,再形成我们看到的不同颜色。这个标准中关于字体颜色定义部分叫做SGR( Select Graphic Rendition ),格式是:

CSI code_num m

其中CSI( Control Sequence Introducer ,这里是 [ )是控制符起始标志, code_num是字体颜色代号(详见ansi escape code的 SGR parameters 一节中对代码30~37的说明), 可以是单一代码,也可以是用分号分隔的多个代码,其中00表示关闭所有颜色选项(可以理解为“复位”), 01表示“亮色”,34表示“蓝色”,所以上图的原始报文可以翻译为:

anaconda-ks.cfg <颜色初始化><亮色、蓝色>Desktop<颜色初始化> install.log

下面是一个 ls -l 命令的结果截图和对应的原始ASCII码,其中字体颜色有: 蓝色(30+4),红色(30+1),绿色(30+2)以及绿色背景(40+2);

drwxr-xr-x 2 godu boco  4096 2011-04-15 <ESC>[01;34maaa111<ESC>[00m 
drwxr-xr-x 4 godu boco  4096 2011-03-03 <ESC>[01;34maatest<ESC>[00m 
-rw-r--r-- 1 godu boco  4899 2011-06-14 <ESC>[00mcrc32.c<ESC>[00m 
-rw-r--r-- 1 godu boco  579 2011-06-14 <ESC>[00mcrc32 oracle.txt<ESC>[00m 
drwxr-xr-x 4 godu boco  4096 2011-05-11 <ESC>[01;34mGoduDb_test<ESC>[00m 
-rw------- 1 godu boco 2836280 2011-05-11 <ESC>[01;31mGoduDb_test.zip<ESC>[00m 
drwxr-xr-x 7 godu boco  4096 2011-04-28 <ESC>[01;34mGODU-platform<ESC>[00m 
drwxr-xr-x 7 godu boco  4096 2010-12-20 <ESC>[01;34mGODU-platform_bak5-6<ESC>[00m 
-rw-r--r-- 1 godu boco 56420261 2011-05-06 <ESC>[01;31mGODU-platform-V2.1_P2_20110506.tar.gz<ESC>[00m 
-rwxr-xr-x 1 godu boco  7652 2011-06-14 <ESC>[01;32mlibcrc32.so<ESC>[00m 
drwxr-xr-x 60 godu boco  4096 2011-05-06 <ESC>[01;34mterracotta<ESC>[00m 
drwxrwxrwx 13 godu boco  4096 2011-02-16 <ESC>[34;42mterracotta-2.7.2<ESC>[00m 
-rw-r--r-- 1 godu boco 58982400 2011-02-16 <ESC>[01;31mterracotta-2.7.2.tar<ESC>[00m 
-rw-r--r-- 1 godu boco 49970439 2011-02-16 <ESC>[01;31mterracotta-2.7.2.tar.gz<ESC>[00m

光标定位和擦除屏幕

屏幕绘制方面的主要有“指定光标位置”(CSI n;m H)和“擦除显示”两类, 后者包括“擦除屏幕”(CSI n J)和“擦除行”(CSI n K)两小类, 参数用法见 wiki对CSI Codes的说明 ,其中“擦除行”被用于用户输入退格键(Backspace)的处理, 当用户(client)向server发送退格键(0x08)时,server返回的是"08 1b 5b 4b", 也就是"Backspace [K",其中Backspace使光标向前一个字符, "["是转义字符起始标志(CSI),"CSI K"表示擦除光标到行尾的所有内容。

下面是一个mina server的handler的sessionOpened方法,使用了CSI5;5H和CSI2J,客户端连入这个server的效果如下图:

@Override 
public void sessionOpened(IoSession session) { 
    byte[] aes = { 0x1b, 0x5b, 0x35, 0x3b, 0x35, 0x48, 0x1b, 0x5b, 0x32, 
        0x4a, 0x1b, 0x5b, 0x30, 0x30, 0x6d, 0x1b, 0x5b, 0x33, 0x34, 
        0x3b, 0x34, 0x32, 0x6d, 0x32, 0x2e, 0x31, 0x1b, 0x5b, 0x30, 
        0x30, 0x6d }; 
    String aesStr = new String(aes); 
    session.write(aesStr); 
    System.out.println(aesStr); 
}

<ESC>(B: Set to US ASCII character set(see " VT100 ESC sequences "for detail);

设置窗口标题(Set Window Title)

用putty登录10.0.2.47的23端口,收到的原始报文如下(用Wireshark抓包):

\033]0;godu@goduserver:~\007[godu@goduserver ~]$

可以看到登录成功后窗体标题变了,原因就是上面的“\033]0;...\007”造成的;

参考:Color Bash Prompt

切换屏幕

\033[?1049h和\033[?1049l分别是切换到新屏幕和切换回来,演示程序见笔记 演示切换屏幕控制序列的程序 。

参考:

  • Alternate screen buffer in Xterm/FreeBSD

  • DECSC in tmux vs xterm

光标显示/隐藏

\033[?25h和\033[?25l分别是显示和隐藏光标;

模式

Normal和Application模式的区别见 Cursor key mode.



Published

Mar 19, 2012

Last Updated

Mar 19, 2012

Category

Tech

Tags

  • telnet 10

Contact

  • Powered by Pelican. Theme: Elegant by Talha Mansoor