如果 putty 连接到在 Windows 上运行的 ssh 服务器,并且 cmd.exe 用作 shell,则光标键无法正常工作。通常,您可以使用 调用旧命令,cursor up/down
但在 putty 中,这不再起作用。
更改 putty 的终端类型对我来说不起作用。使用替代 shell 不是解决方案。如果无法使用 putty,是否有任何其他 ssh 客户端允许修改键绑定/终端模拟?
答案1
问题很可能不是出在客户端,而是出在服务器上。
PuTTY 是一个 Xterm/VT100 终端仿真器。VT100 终端将连接到简单的 8 位串行流的一端,它会发送功能键的特殊“转义序列”——例如,ESC [ A
箭头键Up——这在当今的 Linux 和 BSD 中一直存在。基本以外的行编辑← Backspace由程序本身处理,通过读取和解析这些转义序列,并输出更多转义序列以移动光标和显示文本。Telnet 和 SSH 都可以被认为是终端流的简单载体,就像串行线一样。
导致您出现问题的原因是 Windows 控制台不是以这种方式工作——控制台不是流,而是一个屏幕缓冲区。控制台子系统内置了行编辑(和基本历史记录),并且命令执行程序只需使用此功能即可读取控制台()– 除非程序明确禁用“行输入”模式,否则箭头键事件不会到达程序。(Windows API 也有单独的输出样式函数。)当命令执行程序的输入连接到管道,而不是控制台,该系统被绕过,所有内容都直接插入到输入流中。由于命令执行程序不是为处理 VT100 序列而编写的,它没有对它们进行任何特殊处理,而ESC
只是成为输入命令的一部分。
这意味着 Windows SSH 服务器以及 Windows 内置 Telnet 服务器必须将 VT100 序列转换为控制台事件,并将格式化的控制台输出转换为 VT100 序列。并非所有 SSH 服务器实际上都会这样做。确保远程端没有更改其使用的 SSH 服务器软件。如果密钥曾经工作与相同的配置如下,请尝试将 PuTTY 重置为其默认设置,putty -cleanup
或者手动删除注册表分支。
Windows PowerShell 自带远程处理支持,它使用本地行编辑,只向远程端发送完整的行,从而避免了这个问题。对于命令执行程序,这可以通过执行(尽管 SMB 连接默认不加密),或者你可以开始命令在 PowerShell 远程会话中。