Telnet 服务器回显选项导致不需要的空白

Posted

技术标签:

【中文标题】Telnet 服务器回显选项导致不需要的空白【英文标题】:Telnet server echo option leads to unwanted whitespace 【发布时间】:2021-09-16 11:51:20 【问题描述】:

我正在用 Rust 构建一个 telnet 服务器。我希望服务器能够显示文本文件并响应从客户端发送的自定义单字符命令。用户应该能够只按一个键并让服务器响应——他们不应该看到他们的输入,所以我使用了 telnet ECHO 选项,这样客户端就不会显示用户的输入。 但是,在我发送回显选项后,每当我打印文件或某些字符串时,都会插入额外的空格。

我已压缩代码以隔离问题:

文件:main.rs

fn main() -> std::io::Result<()> 

    let listener = TcpListener::bind("127.0.0.1:4321")?;

    for stream in listener.incoming() 
        let mut stream = stream?;

        let contents = fs::read_to_string("file.txt")
            .expect("Couldn't find file.");

        // This array is [255, 251, 01]
        stream.write(&[IAC.byte(), WILL.byte(), Echo.byte()])?;
        stream.write(contents.as_bytes())?;
        // This array is [255, 252, 01]
        stream.write(&[IAC.byte(), WONT.byte(), Echo.byte()])?;
        stream.write(contents.as_bytes())?;
    
    Ok(())

文件:file.txt

Hello
This
Is
A
File.

当我运行它并通过 telnet 在本地连接时:

celie:~$ telnet localhost 4321
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello
     This
         Is
           A
            File.
                 Hello
This
Is
A
File.
Connection closed by foreign host.

当我将 telnet 代码写入流时,我可以重新排列,并且我使用了其他 telnet 选项并从客户端获得了有效的响应,但是只要我说“WILL Echo”,所有后续输出都会得到所有这些额外的空格,直到我说“WONT Echo”。

我希望文件简单地正常显示,并且在换行符之后不添加空格,这在我不使用 echo 选项时有效,即使我使用其他 telnet 选项。

空格似乎根本不应该与 echo 选项相关!任何 telnet 见解都值得赞赏!

【问题讨论】:

我知道人们使用 telnet 来测试明文 TCP 协议,但在这种情况下,我认为 telnet 只是增加了混淆,例如普通的 netcat (在 Mac 上你可能可以用自制软件得到它)。在 Windows 上,您从 ncat.org 获得的发行版中有一个 ncat 二进制文件。 【参考方案1】:

您所做的与本地终端上的“原始模式”大致相同(应用程序使用它来禁用回显和行编辑并自行处理输入)——在这种情况下,服务器/应用程序负责发送 两个行尾的控制字符,而通常操作系统内核会为您执行此操作。

您必须发送一个回车符 ("\r"),将光标向左移动,并发送一个换行符 ("\n"),将光标向下移动。 您只发送换行符(这是现代文本文件的惯例),因此光标向下移动但不向左移动。如果您发送了一个较长的文件,您会注意到文本会环绕右边缘,但总是在前一个结尾的下方开始新的一行。

将文本复制到 TCP 流时,必须检查换行符并插入必要的回车符。

【讨论】:

以上是关于Telnet 服务器回显选项导致不需要的空白的主要内容,如果未能解决你的问题,请参考以下文章

Windows下bat脚本判断端口是否可用

Telnet 使用用户名和密码登录到邮件服务器

Linux脚本telnet HEAD请求[重复]

Centos 7 telnet 详解

怎样打开telnet服务器端口?

HTTP Web 服务器 POST 返回空白页(Python)