让 PuTTY 与 FreeBSD 一起正常工作

Sti*_*lez 4 freebsd keyboard putty tty console

我正在将 FreeBSD 11 与 PuTTY 用于 SSH。键盘的键码似乎根本没有正确设置 - 例如,它在向上箭头上发出哔哔声并为大多数导航键插入“~”,包括箭头和删除键等基本功能。键盘是标准的英国英语键盘。打字真的很痛苦。

我已经阅读了许多关于在 rc 和 shell 中设置关键代码的线程,所以我知道我可以将其设置为最后的手段。

但是对于具有如此多可配置性的客户端和具有如此广泛用途的操作系统来说,如果没有一些他们都“只是理解”的共同终端选项/设置,我可以在两者上进行设置,瞧——这将是非常奇怪的键所有(或大部分)工作。问题是我不知道如何找到它,当我找到它时,如何为以后的所有会话设置它。

我了解如何找到终端为单个密钥发送的密钥代码,因此我可以通过这种方式一个一个地设置我的密钥。但是我想为我的 shell rc 和 PuTTY 找到基本的终端设置,这让两者都能理解尽可能多的键,所以如果我需要它们,我只需要设置一些例外。

我怎样才能做到这一点?

Cla*_*sen 11

有很多旋钮可以转动。互联网上的许多建议人们盲目遵循。与往常一样,前往罗马的方式有很多,但是当您知道事物之间的联系时,它们就非常简单了。

超简短的答案是:

将 Putty 中的终端字符串从 更改xtermputty(在连接 -> 数据 -> 终端类型字符串下)。

要避免的典型陷阱:

确保您没有TERM在 rc 文件的其他地方进行设置。

稍长的答案:

首先,我将首先确保您实际上使用的是默认值。从我使用 DK 键盘(和映射)的个人 Windows 10 笔记本电脑连接到带有 DK 映射的 FreeBSD 11.1 设置。在我的情况下,箭头键在命令行上按预期工作。在当前行上向左/向右移动。Up/Down 遍历命令历史记录。

我已经为 /bin/sh(默认用户 shell)和 /bin/tcsh(默认 root shell)验证了这一点。您可以阅读有关shell 的内容

您写道,您知道如何在 shell rc 文件中进行键盘映射。关于如何做到这一点的许多建议都在流传。但这通常不是你应该做的。

对于 tcsh 键绑定,您会发现这样的建议:

# Del(ete), Home and End 
bindkey "\e[3~"   delete-char
bindkey "\e[1~"   beginning-of-line
bindkey "\e[4~"   end-of-line
Run Code Online (Sandbox Code Playgroud)

像这样的 bash 建议(~/.inputrc)

"\x7F": backward-delete-char
"\e[3~": delete-char
"\e[1~": beginning-of-line
"\e[4~": end-of-line
Run Code Online (Sandbox Code Playgroud)

但是,与其在本地为每个会话和每个 shell 设置这些绑定,不如为此目的使用termcap / terminfo(稍后会详细介绍)。

在这种情况下,Putty 是您的终端

Putty 的默认设置是将会话的 TERM 设置为“xterm”。这样做是因为它与 xterm 相当兼容。xterm不是对任何终端的引用,而是对程序Xterm的引用。

腻子配置

Connection -> Data -> Terminal-type string: `xterm`
Run Code Online (Sandbox Code Playgroud)

登录后,您可以验证此设置是否适用于您的会话:

echo $TERM
xterm
Run Code Online (Sandbox Code Playgroud)

如果 $TERM 与您在 Putty 中设置的不匹配,那么您可能在 rc 文件中设置了覆盖。注意/bin/shin的警告~/.profile

# Setting TERM is normally done through /etc/ttys.  Do only override
# if you're sure that you'll never log in via telnet or xterm or a
# serial line.
# TERM=xterm;   export TERM
Run Code Online (Sandbox Code Playgroud)

因为我们不再使用很多物理DEC VT100xterm东西,你会在很多地方看到它。

即使你只是保持TERM原样,xterm你也会使用默认的 Putty 和 FreeBSD 获得颜色输出ls -G

有些人会建议您设置TERMxterm-colorxterm-256rxvt-256color获得“适当”的颜色支持。

但请记住:所有这些魔法TERM值都只是数据库中的映射。xterm今天如此普遍的一个原因是一些程序和脚本检查是否$TERMxterm(这是一个可怕的想法)开头。

这让我们回到了在 FreeBSD 上默认的termcap。如果你想使用 terminfo 那么你需要安装devel/ncurses。有关更多信息,请参阅:如何在 FreeBSD 上使用 terminfo 条目?

您可以在文本文件中找到 termcap 数据库的来源 /usr/share/misc/termcap。如果对此文件进行更改,则需要运行cap_mkdb以使系统确认更改。在这里,您将找到难题的答案。TERMPutty有一个显式设置,名为:putty

FreeBSD 然后选择不更改设置xterm以匹配 Putty 的行为(可能是出于可战斗性的考虑)。但是他们已经足够好,可以为 Putty 提供设置。

因此,如果您将 Putty 默认设置更改为Terminal-type string:from xtermputty那么这会在TERM您登录时反映出来。默认的 FreeBSD termcap 有一个条目。

神奇的是,在不接触很多 rc 文件的情况下,您现在可以使用箭头键(我在 xterm 中也有),而且 Home/End 移动到行首/行尾,Del(ete) 删除。

奖金:

似乎默认的腻子定义不支持所有 256 种颜色。然后您可以修改您的 termcap 并添加这两行(并运行 cap_mkdb):

putty-256color:\
        :pa#32767:Co#256:tc=putty:
Run Code Online (Sandbox Code Playgroud)

然后你可以设置你TERMputty-256colorScott Robison建议应该添加这个——但是 FreeBSD 没有接受这个变化。我再也无法在数据库中找到这个 PR。

奖励2:

如果您更喜欢保持TERM原样,xterm那么您应该花时间配置 Putty 以匹配 FreeBSD 对 xterm 终端的期望。

如果您在设置Home 和 End 键中转到设置终端 -> 键盘,您可以将“标准”更改为“rxvt”。

通过此更改,您会注意到 Home 键在命令行上起作用(移动到行首)。但是 End 现在什么都不做。

因此,问题是让 Putty 同意 FreeBSD 对 xterm 的期望。只是为了表明你也可以反过来。