解释SSH输出

3
我正在使用Renci SSHNet库创建一个SSH客户端,但我完全不知道如何解释终端执行命令的输出结果。
例如,如果我输入像“ls -l”、“cd /root”或“dir”这样的简单命令,预期的输出字符串会在我的Windows控制台窗口中显示。
但是,当我尝试使用“nano”编辑文件或查看CPU/内存使用情况时,基本上任何应该显示静态文本的内容,我都会从ssh主机获取一堆二进制数据。
←[?1049h←[1;24r←(B←[m←[4l←[?7h←[?12l←[?25h←[?1h←=←[?1h←=←[?1h←=←[39;49m←[39;49m←
(B←[m←[H←[2J←(B←[0;7m  GNU nano 2.2.6                File: test
←[23d^G←(B←[m Get Help  ←(B←[0;7m^O←(B←[m WriteOut  ←(B←[0;7m^R←(B←[m Read File
←(B←[0;7m^Y←(B←[m Prev Page ←(B←[0;7m^K←(B←[m Cut Text  ←(B←[0;7m^C←(B←[m Cur Po
←[24d←(B←[0;7m^X←(B←[m Exit←[14G←(B←[0;7m^J←(B←[m Justify   ←(B←[0;7m^W←(B←[m Wh
ere Is  ←(B←[0;7m^V←(B←[m Next Page ←(B←[0;7m^U←(B←[m UnCut Text←(B←[0;7m^T←(B←[
←[3d Spell

所以我的问题是,我应该如何理解这一切?我只需要有人指导我走向正确的方向。

2个回答

5
您需要编写一个终端仿真器。欢迎来到Unix终端的怪异世界。您可能想参考“man terminfo”、“man termcap”和“man ncurses”以了解一些基础知识。
实际上,任何Unix机器上的终端窗口或控制台都是在模拟旧式串行终端,而这本身又是在模拟电传打字机的特性层之上的。因此,所有那些ESC[?]序列都是发送给终端的命令,请求它执行某些操作。其中一些将期望响应以提供像窗口大小、大写锁定状态等信息。terminfo数据库记录了给定终端类型的所有转义序列(您可能需要从名为“xterm-color”的类型开始)。

4
当程序显示“静态文本”或以其他方式控制整个终端显示时,它实际上是使用隐藏的控制字符(如您的blob中显示的那些字符)向终端打印命令。参见此处的答案。像ncurses这样的库通过从terminfo获取有关主机终端的信息来提供便携式终端控制API。
在您的项目中,我想您将不得不获取某种主机命令序列的字典,并在打印到客户端终端时过滤或解释它们以正确显示。您可以查看colorama项目,该项目将ANSI命令序列转换为Win32调用,以正确控制Windows命令终端。但这是针对Python的,我对此一无所知。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接