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