8

我想写一个远程控制台,像 telnet 服务器一样工作。用户可以使用 telnet 登录服务器,然后编写一些命令来做一些工作。

一个很好的例子是路由器操作系统的控制台。我现在困惑的是,我可以接受用户的输入,做一些事情然后打印一些文本,但我想使用 ncurses 使控制台具有更多功能(例如“cmd自动完成”,语法颜色...... ),那么我该怎么做呢?因为控制台在用户端,如果服务器调用 ncurses API,它只会改变服务器上的东西......

也许这是一个愚蠢的问题,但我真的是这方面的新手。任何建议表示赞赏。

4

2 回答 2

10

这比你想象的要困难。

您需要了解终端是如何工作的——它们使用特殊的控制序列来移动光标或颜色输出。这由终端特定的terminfo文件描述。Ncurses使用 terminfo 将 API 调用(例如将光标移动到某个位置)转换为此类控制序列。

由于终端(现在xterm, gnome-terminal, screen,tmux等)位于客户端,因此您必须将终端的类型从客户端传递给服务器。这就是为什么例如ssh将此信息从 ssh 客户端传递到服务器的原因(尝试echo $TERM在您的 ssh 会话中 - 如果您通过控制台登录,它可能是“linux”,或者如果您使用 X 和 xterm,它可能是“xterm”)。此外,您最好在服务器上提供相应的 terminfo。

另一个难题是伪终端。由于现在使用串行终端的人相对较少,因此它们的语义被模拟,以便curses最初为串行控制台开发的应用程序和库(例如及其朋友)继续工作。这是通过伪终端实现的——这些就像管道一样,主设备和从设备进行通信,任何写在一侧的东西都会从另一侧出来。例如,对于登录过程,getty可以只使用 pty 设备的一侧并认为它是串行线路 -您的服务器程序必须处理 pty 的另一侧,将它从 pty 获得的所有内容通过网络发送到您的客户端.

终端仿真器也使用 ptys,在您的终端中键入,如果您使用的是终端仿真器tty,您会得到类似的东西。/dev/pts/9在 pty 的另一边,它通常是你的 shell,通过 pty 与你的终端仿真器通信。

您的客户端程序或多或少可以只使用标准输入和标准输出。如果您的终端信息是正确的,其余的将由您的终端仿真器处理,只需将您从服务器程序接收到的任何内容传递到stdout,并将您读取的任何内容发送stdin到您的服务器程序。

希望我没有遗漏任何重要的细节。祝你好运!

于 2013-05-06T22:00:57.033 回答
2

可以让 ncurses 在 stdin 和 stdout 以外的流上运行。调用newterm()beforeinitscr()为 ncurses 设置输入和输出文件句柄。

但是您需要知道连接的远程端是什么类型的终端(ssh 和 telnet 都有与服务器通信的机制),并且您还需要回退到非 ncurses 接口以防远程end 不是受支持的终端类型(或者如果您无法确定终端类型)。

于 2013-05-07T22:45:42.993 回答