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


9

我有一些设备连接到Cisco序列服务器。当我telnet直接连接到Cisco上的端口时,许多设备工作正常。但是,Backspace由于默认情况下在telnet中映射了一些顽固的设备,它们将不使用。

如果很重要,我可以从rxvtDebian挤压(在X窗口中)进行telnet 。 TERM被设置为rxvt,但它不会不管我是否使用vt100vt101xterm...改变TERM没有效果。我TERM根据在旧的《柯米特常见问题解答》中看到的内容开始了变革之路。FWIW,stty erase ^hstty erase ^?没有擦出火花。

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

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

编辑

万一重要,这是有showkey -a问题的键的输出... ^?对应于Backspace^HCtrlH。当我看《 Linux键盘和控制台方法》时,似乎应该走近了,但我似乎无法破译我可以做些什么来改变这一点。我尝试了各种咒语,但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
你试过了ssty erase '^?'吗?如果设备坚持C-h,这不是telnet的呼叫,而是终端(仿真器)的呼叫。
吉尔(Gilles)'所以

@Gilles您的评论实际上是不正确的,请参阅下面的答案
Mike Pennington

Answers:


10

我终于在Anne Baretta的Linux Keyboard Shame Hall中找到了答案。似乎xterm/ rxvt中更改键映射并没有好处telnet

我嗅探telnet连接时对此进行了验证。首先,我嗅探telnet会话,然后将其Backspace发送0x7f到主机。接下来,我故意打破了Backspacerxvt使用stty erase $(因此映射我退格在美元符号rxvt)。完成此操作后,我不得不在$中退格rxvt,但在远程主机上使用时telnet仍会发送。0x7fBackspace

创建一个名为kbdfix(如下)的脚本,并使其具有755权限即可执行;您将需要从发行档案中加载tclshexpect软件包。

#!/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
stty erase $不会将“退格”键映射为“ $”,而是告诉tty驱动程序要擦除字符,需要使用“ $”键。运行telnet时,您处于原始模式,因此将忽略此设置。一个简单的解决方案是将终端仿真器配置为向后退发送^ H,这是上帝的意图,另一种方法是使用您的黑客程序,该程序使用Expect即时转换这些字符。
jlliagre 2011年

@jlliagre,是的,我发现使用时如何stty不改变telnet键盘的读数wireshark;但是,直到我嗅出这个重要事实,我才意识到。我将研究如何更改Backspace以Control_hrxvt...中使用,或者也许我需要考虑寻找另一个术语。
麦克彭宁顿

@Mike:我认为您仍然对某些事情感到困惑(我既不承认jlliagre也不明确提及;我已经更新了答案)。stty需要在应用程序端运行。我非常怀疑telnet是翻译输入字符还是需要使用script; 仅stty在远程计算机上运行就可以解决问题。
吉尔(Gilles)'所以

@Gilles,远程计算机是网络设备,它没有stty
麦克·彭宁顿

1
@Mike:使用netcat时,终端处于熟模式:您编写一行,在本地进行编辑,然后Enter发送。使用telnet时,终端处于原始模式:每个字符都会立即发送到应用程序。请参阅本页面开头或本维基百科文章
吉尔(Gilles)'所以

3

Backspace和Control-H被设计为相同的东西,但是如今,尤其是在Linux上,您经常有Backspace发送delete和delete发送一些奇怪的转义序列。

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


您的问题基于以下假设:telnet正在对Backspace密钥进行特定处理,我认为这是错误的。我应该把它作为评论而不是答案。
jlliagre

AFAICT,telnet不注意键盘的本地终端映射。 安妮·巴雷塔(Anne Barreta)关于键盘和telnet的笔记
迈克·彭宁顿

恐怕您误会了stty的功能。
jlliagre 2011年

3

程序应该查询终端设置以找出退格字符是什么(^h^?,即\010\177,是那里的两个选择)。使用stty erase '^h'stty erase '^?'声明终端发送的内容。

如果您在终端内远程登录(使用telnet,rsh或ssh),请注意,您必须stty 在应用程序端运行。stty不会告诉终端做任何不同的事情,它会通知本地终端驱动程序(即与终端中运行的应用程序接口的部分)有关终端(历史上是物理对象,现在是终端仿真器)的设置。同样,如果您运行Screen或类似的终端机终端软件,则需要stty在每个屏幕窗口中运行(但通常可以将Screen配置为从其配置文件中执行正确的操作,如果无法立即使用的话) )。

您观察到的行为netcat与vs. 行为的不同telnet是由于使用终端的方式引起的:*在netcat中,终端处于逐行模式(也称为“煮熟模式”)。您编辑一条线(使用本地终端的内置编辑功能,尤其是本地样式设置),然后将其最终状态发送给远程主机。*在telnet中,(本地)终端处于逐字符模式(也称为“原始模式”)。每次击键都直接进入telnet,telnet立即将其中继到远程系统。您依赖于远程系统的线路版功能。

有一些坏的程序不关心终端设置。看起来您遇到了其中之一。最好的选择是更改终端的配置。如果您需要通过远程协议(例如telnet或SSH)与设备通信,并且该设备不可配置,则同样如此。

使用xterm可以很容易:有一个设置可以BackSpace在运行时切换键发送的字符。从左侧按钮菜单,切换“删除是删除”。以编程方式,发送转义序列 \e[?67h以具有BackSpacesend ^h\e[?67l具有BackSpacesend ^?。对应的资源是XTerm.backarrowKeyIsErase。其他终端仿真器可能具有或不具有类似的界面功能或支持转义序列。

许多终端仿真器在按^h^?时发送一个BackSpace,而在按Ctrl+ 时发送另一个字符BackSpace。这在紧要关头很有用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.