如何配置腻子键绑定以正确使用 cmd.exe?

V15*_*I0N 2 command-line putty keyboard-navigation

如果 putty 连接到在 Windows 上运行的 ssh 服务器并且 cmd.exe 用作 shell,则光标键无法正常工作。通常,您可以使用cursor up/downputty调用旧命令,但在 putty 中这不再起作用。

更改腻子的终端类型对我不起作用。使用替代 shell 不是解决方案。如果用腻子不可能,也许有任何替代的 ssh 客户端允许修改键绑定/终端仿真?

use*_*686 5

问题很可能不是客户端,而是服务器。

PuTTY 是一个 Xterm/VT100 终端仿真器。在VT100终端将被连接到一个简单的一端8位串行数据流,它会发出特殊的“转义序列”的功能键-例如,ESC [ A对于Up箭头-这一直坚持在今天的Linux和BSD。超出基本的行编辑? Backspace由程序本身处理,通过读取和解析这些转义序列,并输出更多的转义序列以移动光标和显示文本。Telnet 和 SSH 都可以被认为是终端流的简单载体,就像串行线路一样。

导致您出现问题的原因是 Windows 控制台不能以这种方式工作 - 控制台不是流,而是屏幕缓冲区。控制台子系统具有内置的行编辑(和基本历史记录),而cmd.exe只是将这个功能与ReadConsole() 一起使用——除非它明确禁用“行输入”模式,否则箭头键事件不会到达程序。(Windows API 也具有用于输出样式的单独函数。)当cmd.exe的输入附加到管道而不是控制台时,该系统将被绕过并且所有内容都直接插入到输入流中。由于cmd.exe不是为了处理 VT100 序列而编写的,因此它没有对它们进行任何特殊处理,并且ESC 只是成为输入命令的一部分。

这意味着 Windows SSH 服务器以及 Windows 内置 Telnet 服务器必须将 VT100 序列转换为控制台事件,并将格式化的控制台输出转换为 VT100 序列。并非所有 SSH 服务器实际上都懒得这样做。确保远程端没有更改其使用的 SSH 服务器软件。如果以前的密钥使用与现在相同的配置,请尝试使用putty -cleanup或手动删除注册表分支将 PuTTY 重置为其默认设置。

Windows PowerShell 带有远程支持,它使用本地行编辑并且只将完整行发送到远程端,避免了这个问题。对于cmd.exe,这可以通过psexec实现(尽管默认情况下 SMB 连接未加密),或者您可以从 PowerShell 远程会话中启动cmd

  • @V15I0N Cygwin 的 ssh 服务器与您在通常的 Linux 机器上找到的相同,即 openssh。它不包含对本地控制台程序的特殊支持,主要用于运行 Cygwin shell,例如 bash。 (2认同)