如何使用 TIdTelnet 发送命令?

Posted

技术标签:

【中文标题】如何使用 TIdTelnet 发送命令?【英文标题】:How do I use TIdTelnet to send commands? 【发布时间】:2011-04-28 21:52:35 【问题描述】:

我正在尝试从我的程序中模拟 Vidalia(Tor GUI)中的“新身份”按钮。 I asked about that,根据 Rob Kennedy 的回答,我在我的应用程序中尝试了这个:

IdTelnet1.Host:='127.0.0.1';
IdTelnet1.Port:=9051;
IdTelnet1.Connect(-1);
IdTelnet1.SendCmd('SIGNAL NEWNYM');

但它对我不起作用。即使在我发送命令之后,我也会得到相同的代理。

我正在使用 Indy 9。

我不知道我是不知道如何使用 TIdTelnet 还是不知道如何发送该特定命令。

【问题讨论】:

【参考方案1】:

您不能将 SendCmd() 方法与 TIdTelnet 一起使用。 TIdTelnet 使用内部读取线程,不断从套接字中读取数据(因为 Telnet 是一个异步协议,可以随时接收数据)。 SendCmd() 进行自己的内部读取以接收已发送命令的响应。两个读取操作相互干扰(这个问题同样存在于 Indy 10 的 TIdCmdTCPClient 组件中)。

要使用 TIdTelnet 发送传出命令,您必须使用其 SendCh() 方法单独发送每个字符(如果您升级到 Indy 10,TIdTelnet 有一个 SendString() 方法可以为您处理),然后等到OnDataAvailable 事件根据需要处理响应。

除非 TOR 实际上使用真正的 Telnet 协议(Telnet 序列和所有),那么最好使用 TIdTCPClient 而不是 TIdTelnet。 TIdTelnet 是特定于 Telnet 的客户端,而不是像 TIdTCPClient 那样的通用 TCP/IP 客户端。

【讨论】:

我的回答基于an example,展示了如何使用 Unix telnet 命令连接到 Tor。我的结论是 telnet 是适合这项工作的协议。 Telnet 客户端通常用于测试基于文本的协议,但主要是因为它在大多数操作系统安装中都很容易使用。然而,Telnet 是一个自成一体的协议,有自己的语义,而 Indy 的 TIdTelnet 实现就是为此而生,因此不能成为一个好的通用协议客户端。为此直接使用 TIdTCPClient,例如:Client.Connect; Client.SendCmd('AUTHENTICATE ...', 250); Client.SendCmd('signal NEWNYM', 250'); Client.Write('quit'); Client.Disconnect; 在 Indy 10.5.5 中仍然没有 SendString。 10.5.8 引入了TIdTelnet.SendString() 方法。

以上是关于如何使用 TIdTelnet 发送命令?的主要内容,如果未能解决你的问题,请参考以下文章

使用拆分命令时如何发送无效的用户输入

如何使用命令 2 发送推送通知二进制格式

如何使用 linux 命令行发送 HTML 电子邮件

如何使用java api像jdbc一样直接发送hbase shell命令?

如何使用 C++ 发送 APDU 命令?

如何在使用期望“发送”命令时将输出存储在变量中