我正在浏览器中建立一个终端窗口(像ajaxterm一样)并且不知道要发送到ssh隧道的哪个转义序列(通过paramiko.SSHClient().invoke_shell(term='linux')
打开)。
我找到了key logger并在$ TERM =='linux'的终端中尝试了它,但它返回了ctrl+left
和left
的相同序列(27,91, 68)。
如果我在另一个终端尝试键盘记录器($ TERM =='xterm'),我会得到代码(27,91,49,59,53,68)。但是这些代码不会移动从SSH通道生成预期的输出(这将在正常的Linux shell上移动光标一个字)。即使我用term ='xterm'开始paramiko也是如此。
知道我应该使用什么序列?或者为什么上述顺序不起作用?
更新:我很乐意使用其他终端类型(不是“linux”),但遗憾的是pyte仅适用于VTxxx终端(我相信“linux”就像vt220一样终端 - 无论如何,它的工作原理),所以xterm无法正常工作。
答案 0 :(得分:23)
终端是由键盘和输出设备组成的硬件设备(最初是硬拷贝打印机,后来是CRT监视器)。大型计算机可以连接多个远程终端。每个终端将具有用于与计算机有效通信的协议,对于基于CRT的终端,这包括具有改变光标位置的特殊“控制序列”,擦除当前行/屏幕的部分,切换到备用全屏模式,。 ..
终端仿真器是一个模拟其中一个旧终端的应用程序。它允许执行诸如光标定位,设置前景色和背景色等功能,...终端模拟器尝试模拟某些特定的终端协议,但每个都有自己的一组怪癖和偏差。
Unix系统具有描述终端和终端仿真器的数据库,因此应用程序被抽象出使用中的特定终端(或终端仿真器)。较旧的数据库为termcap(5)
,而terminfo(5)
是较新的数据库。这些数据库允许应用程序查询正在使用的终端的功能。功能可以是布尔值,数字功能,甚至字符串功能,例如:如果特定终端类型具有/支持F12密钥,它将具有“key_f12”(长终端名称),“kf12”(短终端名称), “F2”(termcap名称)描述密钥产生的字符串。尝试使用:tput kf12 | od -tx1
。
由于直接使用功能进行编程可能很麻烦,因此应用程序通常使用更高级别的库,如curses / ncurses,slang等...
有一个名为TERM
的特殊环境变量告诉应用程序他们正在与哪个终端类型进行通信。如果数据存在于数据库中,则应将此变量设置为确切的终端类型,以获得最佳结果。这只是告诉应用程序终端能够理解哪些精确的协议和协议偏差。更改TERM
变量不会更改终端类型,它只会更改应用程序认为正在与之通话的终端类型。
所有这一切,Ctrl+arrow
是一个xterm行为(取决于配置选项),在terminfo / termcap数据库中根本没有反映,所以大多数应用程序都不知道它。无论哪种方式,您的终端模拟器(在您的情况下为pyte
)都支持它,或者它不支持。
假设您的主应用程序是bash
或其他使用readline
库的应用程序,您可能会使用readline的backward-word
(Meta-b / Alt-b / ESC b)默认情况下,可以在inputrc
)中配置。
答案 1 :(得分:9)
使用od -c
进行快速检查后发现,gnome-termainal会生成以下值:
左箭头会生成ESC
- [
- D
。
Control-left-array geneates ESC
- [
- 1
- ;
- 5
- D
答案 2 :(得分:4)
Ctrl +箭头键码是由xterm引入的,而Gnome Terminal和KDE Konsole等类似于与xterm兼容。实际的VT100和VT220终端没有针对此类组合的单独密钥代码。据我所知,Linux控制台旨在与VT100兼容,增加一些功能,而xterm模拟VT220,增加了很多。