如何取消本地回显抑制

14

我正在尝试通过发送0xFF 0xFD 0x2D (IAC DO SUPPRESS_LOCAL_ECHO)来抑制telnet会话中密码的本地回显。这个操作很好用。

我的问题在于如何在输入密码后启用本地回显。我正在发送0xFF 0xFE 0x2D (IAC DONT SUPPRESS_LOCAL_ECHO)。但是我看不到之后输入的任何命令。

我正在使用MS Telnet程序进行连接。

IAC在这里有描述。

Suppress Local Echo在这里定义。


你可能能提供一下你用来发送“suppress local echo”的代码吗?请看我的相关问题 - https://dev59.com/T2w15IYBdhLWcg3wxugh :) - mre
我找不到一个好的方法来解决这个问题。我的解决办法是发送一个退格符,然后再发送一个星号来尝试覆盖字符。这基本上是有效的,但如果用户打字速度很快,可能会出现两个字符,而只有一个退格符被发送的情况。 - Robert Deml
4个回答

20

在 telnet.exe 中的 telnet 会话过程中,按下 Ctrl + ] 可以弹出 telnet 提示。

然后,键入 "set localecho" 或 "unset localecho" 来打开或关闭本地回显(localecho)。

按下 Enter 返回到您的 telnet 会话。


5
但我希望从远程端完成这个操作。远程端正在要求输入密码。我已经使抑制功能正常工作了,只是取消抑制功能还没有成功。 - Robert Deml

6

上面的顺序是错误的。

根据我找到的一些文档,我的顺序应该是错误的(WILL/WONT翻转了)。然而,使用Putty和MS Telnet却可以正常工作 - 很奇怪。

请尝试这个:

// Supress Echo on client:
out.write(0xFF);    // IAC
out.write(0xFB);    // WILL
out.write(0x01);    // ECHO

// Enable again with:
out.write(0xFF);    // IAC
out.write(0xFC);    // WONT
out.write(0x01);    // ECHO

无论这些数据从哪里发送,除非对等方同意,否则它们都不会产生任何影响。 - user207421

4
根据今天的调查:
1. MS Telnet客户端接受'set localecho'和'unset localecho',但除了记录状态之外不做任何操作。它不会在网络上发送任何东西。无论你做什么和'd'说什么,客户端的真实状态仍然是'no local echo'。
2. MS Telnet服务器发送IAC,WILL,ECHO,并在回复中接受IAC,DO,ECHO和IAC,DONT,ECHO,但完全忽略它们,始终保持在WILL ECHO状态。您可以稍后发送IAC,DO,ECHO或IAC,DONT,ECHO,它甚至都不会回复。
因此,如果您使用MS客户端与非MS Telnet服务器通信,或者使用其他客户端与MS Telnet服务器通信,最好保持在无本地回显模式,否则您将获得双重回显。
Windows Vista 64。

MS Telnet客户端在处理ECHO选项方面存在问题 - 当Telnet连接上的主机处于“ECHO”状态时,这意味着它将回显发送给它的内容(可能不是完全一样的副本,允许“烹饪”数据) - 然而,任何Telnet客户机/主机的起始点都必须是未经回显,直到双方都同意为止。对于此特定选项,两端不允许互相回显接收到的内容,否则字符将无限制地被回显 - 但是,微软的一款Telnet客户端声称它会这样做,但实际上从未这样做,并令另一端保持“未启用ECHO”。 - SlySven

-2
发送一个退格键,然后是一个星号。这将备份光标,然后在刚刚打印的字符上打印一个星号。如果连接速度较慢,则该字符可能会存在一段时间。还要查找 '\n' 并不要尝试覆盖它。

1
我不确定这是否应该成为被接受的答案(我知道,已经8年了!)。这是在它已经被显示之后隐藏它,并发送额外的字符。请注意,许多客户端(例如Linux、Mac)将无法正确解释退格键。 - Abel
这可能行得通,除非你在LINEMODE EDIT中。所以要注意一下。 - Jason C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接