类似下面的数据:
telnet终端的vi模式下,用户输入了一个echo aa bb cc dd命令,然后回车执行
请求:
0000 0d 00 ..
响应:
0000 0d 0a ..
响应:(echo的执行结果和提示符)
0000 61 61 20 62 62 20 63 63 20 64 64 0d 0a 1b 5d 30 aa bb cc dd...]0
0010 3b 70 79 77 40 77 6f 72 6b 2d 35 31 3a 20 7e 07 ;pyw@work-51: ~.
0020 70 79 77 40 77 6f 72 6b 2d 35 31 3a 7e 24 20 pyw@work-51:~$
请求:
0000 1b .
请求:(调取上一个命令)
0000 6b k
响应:(得到上一个命令,光标右移的15个字节实际为提示符的长度)
0000 65 63 68 6f 20 61 61 20 62 62 20 63 63 20 64 64 echo aa bb cc dd
0010 20 0d 00 1b 5b 43 1b 5b 43 1b 5b 43 1b 5b 43 1b ...[C.[C.[C.[C.
0020 5b 43 1b 5b 43 1b 5b 43 1b 5b 43 1b 5b 43 1b 5b [C.[C.[C.[C.[C.[
0030 43 1b 5b 43 1b 5b 43 1b 5b 43 1b 5b 43 1b 5b 43 C.[C.[C.[C.[C.[C
请求:(光标跳转到下一个单词处)
0000 77 w
响应:(右移5个字节为echo命令和后面的空格)
0000 1b 5b 43 1b 5b 43 1b 5b 43 1b 5b 43 1b 5b 43 .[C.[C.[C.[C.[C
请求:(cw命令为剪切(删除)当前光标所在单词)
0000 63 c
0000 77 w
响应:(删除当前光标处的单词)
0000 1b 5b 32 50 .[2P
难点在于,从协议本身,我们是无法得知哪一部分数据是提示符的,这就会造成后续的光标移动和实际情况不符。
而提示符信息又是一个随意配置的,这个信息只有服务器掌握,从客户端和中间人都无法直接得知。
在ubuntu系统上,配置提示符非常的容易:
export PS1=提示符串即可
提示符可以是任意字符串且支持转义,甚至可以内容为空。对于中间人来说,自动处理只能通过一些特征数据(如\r\0)来做一些兼容性处理。目前一直没有找到特别好的解决方法。