解释SSH输出



我正试图使用Renci SSHNet库创建一个供个人使用的SSH客户端,但我完全不确定如何解释终端中执行命令的输出。

例如,如果我要键入简单的命令,如"ls-l"、"cd/root"或"dir",输出字符串将按预期显示在Windows控制台窗口中。

但是,当我试图用"nano"编辑文件或用"top"查看cpu/内存使用情况时,基本上是任何应该显示静态文本的东西,我会从ssh主机得到一堆blob,就像这样。

←[?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

所以我想我的问题是我应该如何解释这一切?我只需要有人给我指明正确的方向。

您需要编写一个终端模拟器。欢迎来到Unix终端的怪异之处。你可能想看看"man terminfo"、"man termcap"one_answers"man ncurses"来了解一些介绍。

任何Unix机器上的终端窗口或控制台实际上都是模仿老式串行终端,它本身就是电传打字机模拟之上的一层功能。因此,所有这些ESC[?序列都是给终端的命令,请求它做一些事情。其中一些会期望响应,给出窗口大小、caps锁定状态等信息。terminfo数据库记录给定终端类型的所有转义序列(您可能应该从名为"xterm-color"的类型开始)。

当程序显示"静态文本"或以其他方式控制整个终端显示时,它实际上是在使用隐藏的控制字符(如blob中显示的字符)向终端打印命令。请在此处查看答案。像ncurses这样的库通过从terminfo获取关于主机终端的信息来为终端控制提供可移植的API。

在你的项目中,我想你必须获得某种主机命令序列的字典,并过滤或解释它们,以便在打印到客户端终端时正确显示。您可以查看colorama项目,该项目将ANSI命令序列转换为Win32调用,以正确控制Windows命令终端。但这是针对Python的,我对此一无所知。

最新更新