我在 win7 上使用 putty 作为客户端,登录 debian 服务器上的 ssh。但是我遇到了一个关于 putty 控制台键盘行为的奇怪问题。
我注意到这是关于 Putty 中的键盘配置。读完之后putty使用手册,我成功地使backspace
键工作,但仍然存在有关ESC
、箭头、home
和end
、和F1
-F12
键的问题。
下面我列出了他们的行为。看来,的错误映射ESC
是根本原因。
ESC
=> ^[up
=> ^[OAdown
=> ^[OBright
=> ^[OCleft
=> ^[右下角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[H
ESC [ 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)
输出可能是(033
是ESC键):
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 默认不使用该“配方”,而是设置TERM
为xterm
,正如您所注意到的,它与特殊键(功能、光标)不匹配。ncurses FAQ 中提到了这一点为什么不直接将 TERM 设置为“xterm”?
PuTTY 也因存在问题而被提及TERM
。xterm 常见问题解答,尽管没有专门的部分介绍它,因为它实际上不是一个“xterm”。