我有一些设备连接到 Cisco 串行术语服务器;当我telnet
直接连接到思科的端口时,许多工作正常。然而,我有一些顽固的设备不会使用,Backspace因为它默认映射在 telnet 中。
以防万一,我从rxvt
Debian squeeze 下远程登录(在 X Window 中)。 TERM
设置为rxvt
,但无论我使用vt100
、vt101
、还是xterm
...更改TERM
都没有效果。TERM
根据我在一个项目中所看到的,我开始走上改变的道路老克米特常见问题解答。 FWIW,stty erase ^h
也stty erase ^?
不起作用。
我注意到,如果我使用来自...Backspace的原始 TCP 套接字,则可以在这些设备上正常工作;但是,然后我遇到了密码未隐藏或终端寻呼的其他问题。netcat
nc 192.168.12.117 2006
如何有选择地强制 telnet 和 ssh 映射Backspace到CtrlH这些设备?另外,我应该使用什么标准来评估这是否是设备中的错误?
编辑
showkey -a
如果重要的话,这是相关键的输出...^?
对应于Backspace和。看来我应该靠近看一下^H
CtrlHLinux 键盘和控制台指南,但我似乎无法破译我能做些什么来改变这一点。我尝试过各种咒语,但loadkeys
没有效果。
[mpenning@hotcoffee docs]$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program
^? 127 0177 0x7f
^H 8 0010 0x08
我还包括相关输出dumpkeys
...这是我的系统中的当前映射(在某些有问题的设备上不起作用)。如果我能弄清楚如何做Backspace与 相同的事情CtrlH,我就会有一个解决方案。
[mpenning@hotcoffee docs]$ sudo dumpkeys | grep -Ei "backspace|127"
keycode 8 = BackSpace ampersand braceleft
keycode 14 = BackSpace Delete
control keycode 14 = BackSpace
keycode 127 =
[mpenning@hotcoffee docs]$
答案1
我终于找到了答案Anne Baretta 的 Linux 键盘耻辱堂... 看起来xterm
更改/中的键映射rxvt
没有任何好处telnet
。
当我嗅探 telnet 连接时,我验证了这一点。首先,我嗅探了 telnet 会话并看到它Backspace发送0x7f
到主机。接下来,我故意闯入Backspace使用rxvt
(stty erase $
从而将我的退格键映射到美元符号rxvt
)。完成此操作后,我必须$按退格键rxvt
,但在远程主机上使用时telnet
仍然发送。0x7f
Backspace
解决方案
创建一个名为(如下)的脚本kbdfix
,并使其具有755
权限可执行;您将需要从您的发行档案中加载tclsh
和软件包。expect
#!/usr/bin/expect
#Name this file as kbdfix and make it executable in your path
eval spawn -noecho $argv
interact {
\177 {send "\010"}
"\033\[3~" {send "\177"}
}
现在要连接到损坏的主机,我输入kbdfix telnet 192.168.12.117 2006
,然后Backspace就可以了。
对于那些对上面的 2006 感到困惑的人请注意...这是 Cisco 术语服务器用于与损坏设备(在本例中为 Brocade FCX 交换机)控制台进行串行连接的 TCP 端口。
如果您只是远程登录到不喜欢的设备Backspace,您可以使用kbdfix telnet <addr_of_the_broken_device>
.当我 ssh 到有类似问题的 DLink DGS-3200 以太网交换机时,我也会将其与 ssh 结合使用;语法是kbdfix ssh 172.16.1.26
.
答案2
程序应该查询终端设置以找出退格字符是什么(^h
和^?
,即\010
和\177
,是那里的两个选择)。使用stty erase '^h'
或stty erase '^?'
来声明您的终端发送的内容。
如果您在终端内远程登录(使用 telnet、rsh 或 ssh),请注意,您必须运行stty
在应用程序端。stty
不告诉终端做任何不同的事情,它通知本地终端驱动程序(即与终端中运行的应用程序交互的部分)有关终端(历史上是物理对象,现在是终端仿真器)设置的信息。同样,如果您运行 Screen 或类似的终端中终端软件,则需要stty
在每个屏幕窗口中运行(但通常可以将 Screen 配置为从其配置文件中执行正确的操作,如果它不能开箱即用) )。
netcat
您观察到的行为差异telnet
是由于终端的使用方式造成的: * 在 netcat 中,终端处于逐行模式(也称为“cooked 模式”)。您编辑一行(使用本地终端的内置编辑功能,特别是本地 stty 设置),然后将其以最终状态发送到远程主机。 * 在 telnet 中,(本地)终端处于逐字符模式(也称为“原始模式”)。每次击键都会直接进入 Telnet,然后立即将其转发到远程系统。您依赖于远程系统的线路版本功能。
有一些损坏的程序不关心终端设置。看来你也遇到过其中的一位。最好的办法是更改终端的配置。如果您需要通过远程协议(例如 telnet 或 SSH)与设备进行通信并且该设备不可配置,情况也是如此。
使用 xterm 很简单:有一个设置可以切换BackSpace运行时按键发送的字符。从左侧按钮菜单中,切换“Delete is DEL”。以编程方式发送转义序列 \e[?67h
已BackSpace发送^h
,或\e[?67l
已BackSpace发送^?
。对应的资源是XTerm.backarrowKeyIsErase
.其他终端仿真器可能具有也可能不具有类似的界面功能或支持转义序列。
许多终端模拟器在您按 时发送^h
或之一,在您按+时发送另一个字符。这在紧要关头很有用。^?
BackSpaceCtrlBackSpace
请注意,showkeys
和朋友仅在 Linux 控制台上相关,在 X 中无关。
答案3
退格键和 Control-H 被设计为相同的东西,但现在,特别是在 Linux 上,您经常使用退格键发送删除,而删除则发送一些奇怪的转义序列。
无论如何,据我所知,telnet 或 TERM 变量不应更改退格键发送的内容,这通常是终端仿真器配置功能。