为什么当我按下 Enter 键时 telnet 会发送 CRLF?

为什么当我按下 Enter 键时 telnet 会发送 CRLF?

在我的系统 (Debian) 提供的 telnet 上,换行符 ( \n) 似乎被转换为 CRLF ( \r\n)。具体来说,如果我运行,例如,在另一个终端中netcat -l -p 3334 > file运行,然后执行,我会得到:echo a | telnet localhost 3334hexdump file

0000000 0d61 000a                              
0000003

a\r\n采用小端字节序,即a后面跟着 CRLF。

然而,手册页telnet中关于切换的说明如下crlf

如果为 TRUE,则回车符将以 <CR><LF> 形式发送。如果为 FALSE,则回车符将以 <CR><NUL> 形式发送。此切换的初始值为 FALSE。

因此我希望看到回车符以 CR 形式发送,后跟 NUL。这怎么不是我观察的原因呢?

(请注意,我没有/etc/telnetrc~/.telnetrc。此外,相反,在我的系统上,netcat(当用作客户端时)将换行符发送为 LF(\n),除非-C使用该选项。)

答案1

看什么Telnet 协议规范说[强调我的]:

序列“CR LF”的定义将导致 NVT 位于下一个打印行的左边距(例如,序列“LF CR”)。但是,许多系统和终端并不独立处理 CR 和 LF,因此必须付出一些努力来模拟它们的效果。(例如,某些终端没有独立于 LF 的 CR,但在这些终端上,可以通过退格来模拟 CR。)因此,序列“CR LF”必须被视为单个“换行符”,并在需要执行组合操作时使用;当实际需要单独使用回车符时,必须使用序列“CR NUL”;并且在其他情况下必须避免使用 CR 字符。此规则向必须决定是否执行“换行”功能或多次退格的系统保证,TELNET 流包含 CR 后面的字符,这将允许做出合理的决定。

  • 设置标志crlf表明 CR 符合“CR LF 组合操作预期”的规定。
  • 未设置的标志crlf表明 CR 意味着“实际上只需要回车符”。

但在您的情况下,输入(的输出echo a)不包含 CR根本。它包含 LF,根据“CR LF 组合操作旨在实现”被翻译为“CR LF”。由于输入流中没有 CR,因此该标志不适用。

提供实际包含 CR 的输入:

printf '\r' | telnet localhost 3334

并且接收器将获得“CR LF”或“CR NUL”,具体取决于您的设置(在/etc/telnetrc~/.telnetrc)。

相关内容