使用telnet命令,无需协议协商

使用telnet命令,无需协议协商

我正在使用 telnet 通过 TCP/IP 服务器连接到串行端口。我需要一个原始的、未过滤的、无缓冲的连接,并且可以到达那里的大部分路径,但无论我做什么,telnet 在连接时都会发送协议协商命令。

这很奇怪,因为“man telnet”页面显示:

When connecting to ports other than the telnet port, telnet does not attempt telnet
protocol negotiations. This makes it possible to connect to services that do not
support the telnet protocol without making a mess.

但是,尽管我连接到非标准端口,但 telnet 会协商:

linuxdev:~ griscom$ telnet 172.16.250.49 2023
Trying 172.16.250.49...
Negotiating binary mode with remote host.
Connected to 172.16.250.49.
                           Escape character is '^]'.

而且,正如手册页警告的那样,这会造成混乱。

有没有办法使用 telnet 作为完全透明的 TCP/IP 客户端?或者,还有其他我可以使用的工具吗?

细节:

  • 在 Ubuntu 22.04 系统上运行 telnet
  • 服务器是一个USR-TCP232-T2 以太网转串口转换器
  • 串行端口连接到 Linux 系统的控制台,因此我需要无缓冲透明度,以便我可以运行vim或输入控制字符

编辑:我发现了问题。telnet默认情况下以“行”模式运行,收集字符并在下次键入 CR 时发送它们。我需要它以“字符”模式运行,按原样发送数据。

telnet问题:如果不与线路的另一端协商更改,我无法设置“字符”模式。证明:如果我使用未配置的 telnet 连接到串行适配器,我将不会收到发送到适配器的协商字符。但是,如果我使用^]进入命令模式,然后键入mode charactertelnet将立即与另一端协商,弄得一团糟。 (如果我使用.telnetrc文件来配置与字符模式的连接,也会发生同样的情况。)

因此,如果不向该端口发送虚假命令字节,就无法telnet连接到“字符”模型中的端口。我需要一个不同的解决方案。

答案1

您可以使用netcat( nc) 进行透明连接

   nc {host} {port}

尽管telnet客户端正确地没有尝试协商,但它始终会响应服务器的协商请求。我相信这可能就是本例中发生的情况。您可以使用 来避免任何和所有谈判nc

请注意,您可能会发现nc似乎处于线路模式。事实并非如此,只是终端驱动程序没有被要求进入原始模式:

stty raw; nc {host} {port}

一旦执行此操作,您将无法使用终端会话退出nc;您需要从其他地方向它发送信号:

ps | grep -w nc    # 60883 pty0     00:00:00 nc
kill 60883         # ^this^

相关内容