如何在telnet客户端实现选项卡完成

时间:2013-12-09 09:39:01

标签: c linux autocomplete command-line-interface tab-completion

我有一个服务器可以打开telnet客户端的连接,比如 例如: 我运行服务器./server,在另一个窗口中我运行telnet客户端作为telnet localhost 9999, 当我运行telnet客户端时,我将以CLI>>。

获得新的CLI提示符

从这个提示我需要自定义标签完成,但许多博客说我们真的没有在telnet端实现readline功能,如果是这样我们就去了我们自己的客户端。

我如何实现它?任何相关的帮助将不胜感激。我使用的是linux(Ubuntu)和C语言。

3 个答案:

答案 0 :(得分:1)

您可以在客户端或服务器上实现此功能。

对于客户端实现,有两种方式(基本相同):

  1. 当客户端连接时,服务器会发送一个命令列表及其参数,并在客户端中缓存。当用户按下 TAB 键时,客户端会搜索此缓存数据。

  2. 当客户端注意到 TAB 键被按下时,它会要求服务器提供可能的完成列表。为了速度,这个列表应该缓存在客户端。

  3. 所以这里的基本解决方案是:服务器向客户端发送数据,客户端显示数据。


    对于服务器端实现,您必须使用telnet协商来告诉客户端发送未经烹煮的原始字符和密钥,而不会对服务器造成任何干扰。然后服务器可以检查 TAB 键并执行完成。

    这里的问题是,你必须在服务器代码中添加所有命令行编辑和提示,并且不能依赖客户端只是一个“哑终端”。


    完成服务器端的所有处理后,您可以使用几乎任何telnet客户端(只要它可以处理telnet协商)并且不必创建自己的自定义客户端。缺点是您必须自己在服务器中实现整个命令行编辑功能,并且按键的延迟可能很高,因为必须将每个密钥发送到服务器,然后从服务器回送。

    拥有一个自定义客户端有一个好处,即有一些库可以轻松处理命令行编辑并帮助完成。这里的主要缺点是你必须制作一个自定义客户端。

答案 1 :(得分:1)

telnet host后,输入ctrl + ]进入telnet命令提示符,然后执行mode character。之后,telnet客户端进入“一次一个字符”模式,选项卡完成应该可以正常工作。

sunnogo@a3e420:~$ telnet 192.168.193.88 10015   
Trying 192.168.193.88...  
Connected to 192.168.193.88.  
Escape character is '^]'.  



my_prompt>
my_prompt>

my_prompt>

my_prompt>^]  
telnet> mod character

my_prompt��  
my_prompt>  
my_prompt>  

答案 2 :(得分:0)

您必须将telnet客户端置于char模式,因此它在键入时将每个密钥直接发送到服务器(而不是等待返回密钥发送完整的行)。然后,每当您收到'\ t'时,检查在'\ t'之前收到的内容,并根据您是否可以完成该行,发回完整的行或可能的列表。基本上,您正在服务器中实现readline()。