我最近开始尝试MUD 。通过 Mac 上的终端,我没有遇到任何问题。然后我尝试通过我的 Linux 计算机以RXVT-unicode /Bash登录。
$ echo $TERM
rxvt-unicode-256color
$ telnet aardwolf.org
Trying 23.111.142.226...
假设我按下 Backspace、Up(箭头)、Down、Right Left 键,我会看到:
> ^?^[[A^[[B^[[C^[[D
来自 MUD 服务器的文本显示看起来很好,有颜色等等。
我试过了TERM=xterm telnet aardwolf.org
,但无济于事。我猜是某些终端设置或 Telnet 的问题,但无论用多少搜索引擎似乎都找不到确切的问题,而且我对这里涉及的所有技术也不是很了解,无法确定问题所在。
谁能解释一下这里出了什么问题?
如果远程程序根本不支持箭头键,这似乎是正常的结果。
Linux Telnet 客户端没有内置行编辑功能。如果 Telnet 服务器请求“cooked”模式(本地行编辑),那么您只能获得本地操作系统终端设施提供的“cooked”模式 - 并且在 Linux 或其他类 Unix 上不支持任何
/bin/dash
箭头键;您所能做的就是在最终确认行之前按退格键。(例如,您可以通过本地运行或来查看cat > /dev/null
。)Windows 是唯一在控制台级别具有实际行编辑功能的操作系统。如果服务器请求“原始”模式,那么它会接收每个单独的按键,并由服务器根据 TERM 解释这些按键。但是,就像本地程序一样,您通过 Telnet 交互的程序可能根本不会进行任何此类解释 - 例如,Bash 必须明确加载诸如“readline”之类的库来实现在正在编辑的行内移动光标的功能;如果程序不执行任何此类操作,那么它就不会获得箭头键支持,并将以纯文本形式显示收到的按键序列。(同样的例子:如果您要 Telnet 到另一台 Linux 计算机并远程运行 /bin/dash,它也不会进行行编辑。)
Telnet 并不真正参与后一种模式;它只是将按键序列原封不动地转发给服务器。虽然它有一个抽象的“网络虚拟终端”,但只指定了 ASCII 和 8 位字节(而不是 EBCDIC 或 SIXBIT)的使用以及 CRLF 的使用——它是一种甚至早于 TCP/IP 的旧协议,其整个设计也早于 VT110 终端十年,因此它不会对特殊 VT 按键进行任何转换。
因此,如果您的 Rxvt 终端发送
ESC [ A
箭头键(这是“标准”序列),那么服务器就会收到该键,并且服务器端程序必须对其进行解释。Telnet 所做的只是将 TERM 的值转发到远程端,让服务器知道如何解释它,但程序可能仍不会这样做。据我所知,MUD 更常使用 Tintin++ 或 Mudlet 等专门的客户端来访问,这些客户端除了其他功能外还添加了本地行编辑。此线程还建议使用 rlwrap,它可以为任何程序添加 Bash 行编辑。