我想写一个远程控制台,像telnet服务器一样工作。用户可以使用telnet登录服务器,然后编写一些命令来完成一些工作。
一个很好的例子是路由器操作系统的控制台。我现在困惑的是,我可以接受用户的输入,做一些然后打印一些文本,但我想使用ncurses使控制台具有更多功能(例如“cmd auto-complete”,语法颜色...... ),那我该怎么办呢?因为控制台在用户端,如果服务器调用ncurses API,它只会改变服务器上的东西......
也许这是一个愚蠢的问题,但我真的是新手。任何建议都表示赞赏。
答案 0 :(得分:9)
这比你想象的要困难。
您需要了解终端如何工作 - 他们使用特殊的控制序列,例如移动光标或颜色输出。这由终端特定的 terminfo 文件描述。 Ncurses
使用terminfo将API调用(例如将光标移动到某个位置)转换为此类控制序列。
由于终端(现在xterm
,gnome-terminal
,screen
,tmux
等)位于客户端,因此您必须从终端传递终端类型客户端到服务器。这就是为什么,例如ssh
将此信息从ssh客户端传递到服务器(在ssh会话中尝试echo $TERM
- 如果您通过控制台登录,则可能是'linux',如果是,则可能是'xterm'使用X和xterm)。此外,您最好在服务器上提供相应的terminfo。
另一个难题是伪终端。如今,相对较少的人使用串行终端,他们的语义被模拟,以便最初为串行控制台开发的应用程序和库(例如curses
及其朋友)继续工作。这是通过伪终端实现的 - 这些就像管道,主设备和从设备通信,一边写的任何东西都出现在另一边。例如,对于登录过程,getty
可以只使用pty设备的一侧并认为它是一个串行线 - 您的服务器程序必须处理pty的另一端,发送它通过网络从pty到你的客户端的一切。
终端模拟器也使用ptys,在您的终端中键入tty
,如果您使用的是终端模拟器,则会获得/dev/pts/9
之类的内容。在pty的另一端,它通常是你的shell,通过pty与终端模拟器通信。
您的客户端程序可以或多或少地使用标准输入和标准输出。如果您的终端信息正确,则其余信息将由您的终端仿真器处理,只需将您从服务器程序收到的任何内容传递给stdout
,并将您从stdin
读取的任何内容发送到您的服务器程序。 / p>
希望我没有遗漏任何重要的细节。祝你好运!
答案 1 :(得分:2)
可以让ncurses对stdin和stdout以外的流进行操作。在newterm()
之前调用initscr()
来设置ncurses的输入和输出文件句柄。
但是你需要知道连接的远端是什么类型的终端(ssh和telnet都有与服务器通信的机制),你还需要回退到非ncurses接口。如果远程端不是支持的终端类型(或者如果您无法确定终端类型)。