【问题标题】:How to implement tab completion on the telnet client sidetelnet客户端如何实现tab补全
【发布时间】:2013-12-26 08:59:32
【问题描述】:

我有一台服务器,它为 telnet 客户端打开连接,例如 例如: 我运行服务器 ./server 并在另一个窗口中运行 telnet 客户端作为 telnet localhost 9999, 当我运行 telnet 客户端时,我会得到新的 CLI 提示符为 CLI>>。

根据这个提示,我需要自定义选项卡补全,但许多博客说我们真的不能在 telnet 端实现 readline 功能,如果是这样,我们就选择我们自己的客户端。

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 你能告诉我如何将这种线模式转换为字符模式......是编程还是手动。
  • 这个链接我之前看到过,但不知道该怎么做,我是 telnet 的新手。我是否需要启用字符模式,但是如何...在发出 telnet 命令时 ..as telnet localhost 999 ..或者它与编程有关...或者我应该输入什么以及我应该在哪里发出命令。
  • Guntram 真的我现在需要你的帮助...如何从 telnet 客户端接收单个字符...recv 将接收整个命令?
【解决方案2】:

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

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

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

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

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


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

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


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

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

【讨论】:

  • Joachim 我想知道如何在客户端接收 '\t'...这里的大问题是如何在将 telnet 设置为 CHARACTER 模式后逐个字符收集..
  • @Puneeth 如果您使用标准 telnet 客户端,并且它处于字符模式,那么它应该在收到选项卡后立即将选项卡发送到服务器。如果您有自定义客户端,则例如GNU readline library 支持制表符(或其他字符,它是可配置的)以在您的代码中调用回调函数。阅读custom completers here。
  • @Puneeth 如果您有一个自定义的基于 GUI 的客户端,那么 GUI 将具有识别键的功能,包括选项卡。请参阅您在这种情况下使用的 GUI 工具包的参考。
  • 在将 telnet 设置为字符模式后,它开始表现得很奇怪,就像它开始处理每个字符并说无效命令(服务器代码)
【解决方案3】:

telnet 主机后,输入ctrl + ] 进入telnet 命令提示符,然后执行mode character。之后,telnet 客户端进入“一次一个字符”模式,tab 补全应该可以正常工作了。

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>  

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 2010-10-09
    • 2012-01-28
    • 1970-01-01
    • 2022-07-09
    • 2012-04-06
    • 2016-06-03
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多