无法让键盘在 Putty 中正常工作

无法让键盘在 Putty 中正常工作

我在 win7 上使用 putty 作为客户端,登录 debian 服务器上的 ssh。但是我遇到了一个关于 putty 控制台键盘行为的奇怪问题。

我注意到这是关于 Putty 中的键盘配置。读完之后putty使用手册,我成功地使backspace键工作,但仍然存在有关ESC、箭头、homeend、和F1-F12键的问题。

这是我在 Putty 中的键盘配置

下面我列出了他们的行为。看来,的错误映射ESC是根本原因。

  • ESC=> ^[
  • up=> ^[OA
  • down=> ^[OB
  • right=> ^[OC
  • left=> ^[右下角
  • home=> ^[[1~
  • end=> ^[[4~
  • F1=> ^[[11~
  • F12=> ^[[24~

================================================

在这里我将说明为什么我认为 esc 映射错误:

当在正常工作的 ssh 控制台中按下 时esc,它应该什么也不显示。

(before)
root@somemachine:
(after)
root@somemachine:

但是在这个故障的 ssh 控制台中,我按esc,它显示^[

(before)
root@somemachine:
(after)
root@somemachine: ^[

我在两个 ssh 控制台上运行了 od -c,然后按下esc,它们给出了相同的输出。

(normal one)
root@opengg:~# od -c
^[

(malfunctioning one)
$ od -c
^[

答案1

问题是 TERM 环境变量的值与配置的终端特性不匹配 - 特别是“Home 和 End 键”和“功能键和键盘”设置。

这些可能很难做到正确。

Debian 服务器期望什么。

键入infocmp -I以查看您的计算机正在期待什么。

$ infocmp -I 
#       Reconstructed via infocmp from file: /usr/share/terminfo/a/ansi
ansi|ansi/pc-term compatible with color,
        rmul=\E[m, il1=\E[L, kbs=^H, kcbt=\E[Z, kcud1=\E[B,
        khome=\E[H, kich1=\E[L, kcub1=\E[D, kcuf1=\E[C, kcuu1=\E[A,

khome=\E[HESC [ H表示当您按下 时,服务器希望收到三个字符Home

您可以查看 TERM 的其他值的预期

$ infocmp -I xterm
#       Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm
xterm|X11 terminal emulator,
        is2=\E[!p\E[?3;4l\E[4l\E>, il1=\E[L, ka1=\EOw, ka3=\EOu,
        kb2=\EOy, kbs=\177, kbeg=\EOE, kc1=\EOq, kc3=\EOs,
        kdch1=\E[3~, kcud1=\EOB, kend=\E[4~, kent=\EOM, kf1=\EOP,
        kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
        kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
        kf18=\E[32~, kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR,
        kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, khome=\E[1~, kich1=\E[2~, kcub1=\EOD,
        kmous=\E[M, knp=\E[6~, kpp=\E[5~, kcuf1=\EOC, kcuu1=\EOA,

在这里你可以看到,如果TERM设置为,当按下时xterm,该服务器将期望收到( )ESC [ 1 ~Homekhome

如果上面的内容太过晦涩,可以尝试infocmp -L

tput khome | hexdump -C如果您知道您感兴趣的键的 terminfo 功能名称,您还可以执行其他操作。

$ tput khome | hexdump -C
00000000  1b 5b 48                                          |.[H|

或者更清晰地

$ tput khome | hexdump -e '12/1 "%3_u" "\n"'
esc  [  H

或者查看其他 TERM 设置的含义

$ TERM=xterm tput khome | hexdump -e '12/1 "%3_u" "\n"'
esc  [  1  ~

如果输出为空,则服务器认为终端类型(TERM)没有该键。

Putty 实际发送的内容。

要查看Home实际发送的内容,请运行vi,按i(插入模式)按Ctrl+V然后Home按 并按Esc退出插入模式。

解决方案

调整 Putty 配置(或 TERM),直到发送的内容与另一端的预期相匹配。


例如

按照指定的方式进行https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/terminfo.html然后在 Putty 中,配置、连接、数据,终端类型字符串 = PuTTY 并保存。也许吧。

答案2

没有错误映射ESC键键 - ^[ 表示 Control-LeftSquareBracket,即 ASCII 27,即 ESC

如果你怀疑按键顺序错误,可以使用od-c并将它们与信息流输出:

 $ od -c
 (hit F1 Ctrl-D Ctrl-D)

输出可能是(033ESC键):

 0000000 033   [   1   1   ~

将其与 infocmp 的输出进行比较(此处\E表示ESC键):

 $ infocmp -1 | grep 'kf1='
    kf1=\E[11~,

infocmp 输出简介:

kbs= 退格键

kcub1, kcud1, kcuf1, kcuu1= 光标键

kf* = 功能键

kpp/ knp= 向上/向下翻页

khome/ kend= Home / End 键

kich1/ kdch1= 插入/删除键

使用这些信息应该很容易配置你的油灰适合您的系统。

答案3

根据我的经验,这是因为 bash 没有运行,只需运行/bin/bash享受色彩、历史等等。而且这些故障也消失了,使键盘正常工作。

每次连接或更改用户时您可能都必须运行此命令,但这并不难记住。

答案4

当然有一个“配方”,但 PuTTY 的开发人员选择不参与这个过程。这个配方被称为端子描述. 自 ncurses 以来,一直有一个合适的2001(例如参见链接终端数据库)。

对于大多数应用程序来说,终端描述被指定为TERM环境变量。

PuTTY 默认不使用该“配方”,而是设置TERMxterm,正如您所注意到的,它与特殊键(功能、光标)不匹配。ncurses FAQ 中提到了这一点为什么不直接将 TERM 设置为“xterm”?

PuTTY 也因存在问题而被提及TERMxterm 常见问题解答,尽管没有专门的部分介绍它,因为它实际上不是一个“xterm”。

相关内容