强制 telnet / ssh 使用 crtl-H 进行退格

强制 telnet / ssh 使用 crtl-H 进行退格

我有一些设备连接到 Cisco 串行术语服务器;当我telnet直接连接到思科的端口时,许多工作正常。然而,我有一些顽固的设备不会使用,Backspace因为它默认映射在 telnet 中。

以防万一,我从rxvtDebian squeeze 下远程登录(在 X Window 中)。 TERM设置为rxvt,但无论我使用vt100vt101、还是xterm...更改TERM都没有效果。TERM根据我在一个项目中所看到的,我开始走上改变的道路老克米特常见问题解答。 FWIW,stty erase ^hstty erase ^?不起作用。

我注意到,如果我使用来自...Backspace的原始 TCP 套接字,则可以在这些设备上正常工作;但是,然后我遇到了密码未隐藏或终端寻呼的其他问题。netcatnc 192.168.12.117 2006

如何有选择地强制 telnet 和 ssh 映射BackspaceCtrlH这些设备?另外,我应该使用什么标准来评估这是否是设备中的错误?

编辑

showkey -a如果重要的话,这是相关键的输出...^?对应于Backspace和。看来我应该靠近看一下^HCtrlHLinux 键盘和控制台指南,但我似乎无法破译我能做些什么来改变这一点。我尝试过各种咒语,但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使用rxvtstty erase $从而将我的退格键映射到美元符号rxvt)。完成此操作后,我必须$按退格键rxvt,但在远程主机上使用时telnet仍然发送。0x7fBackspace

解决方案

创建一个名为(如下)的脚本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[?67hBackSpace发送^h,或\e[?67lBackSpace发送^?。对应的资源是XTerm.backarrowKeyIsErase.其他终端仿真器可能具有也可能不具有类似的界面功能或支持转义序列。

许多终端模拟器在您按 时发送^h或之一,在您按+时发送另一个字符。这在紧要关头很有用。^?BackSpaceCtrlBackSpace

请注意,showkeys和朋友仅在 Linux 控制台上相关,在 X 中无关。

答案3

退格键和 Control-H 被设计为相同的东西,但现在,特别是在 Linux 上,您经常使用退格键发送删除,而删除则发送一些奇怪的转义序列。

无论如何,据我所知,telnet 或 TERM 变量不应更改退格键发送的内容,这通常是终端仿真器配置功能。

相关内容