我正在浏览器中构建一个终端窗口(比如 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 channel 生成预期的输出(这会使光标在普通的 linux shell 上向左移动一个词)。即使我以 term='xterm' 开始 paramiko 也是如此。
知道我应该使用什么顺序吗?或者为什么上面的顺序不起作用?
更新:我很乐意使用另一种终端类型(不是“linux”),但不幸的是pyte仅适用于 VTxxx 终端(我相信“linux”是类似 vt220 的终端 - 无论如何,它可以工作),所以 xterm 无法正常工作。
最佳答案
终端是由键盘和输出设备(最初是硬拷贝打印机,后来是 CRT 显示器)组成的硬件设备。一台大型计算机可以连接多个远程终端。每个终端都有一个与计算机有效通信的协议(protocol),对于基于 CRT 的终端,这包括有特殊的“控制序列”来改变光标位置,删除当前行/屏幕的部分,切换到备用全屏模式,. ..
终端仿真器是一种模拟这些较旧终端之一的应用程序。它允许执行诸如光标定位、设置前景和背景颜色等功能……终端仿真器试图模拟一些特定的终端协议(protocol),但每个协议(protocol)都有自己的一组怪癖和偏差。
Unix 系统具有描述终端和终端仿真器的数据库,因此应用程序从使用中的特定终端(或终端仿真器)中抽象出来。较旧的数据库是 termcap(5)
,而 terminfo(5)
是较新的数据库。这些数据库允许应用程序查询正在使用的终端的功能。功能可以是 bool 值、数字功能,甚至是字符串功能,例如:如果特定终端类型具有/支持 F12 键,它将具有功能“key_f12”(长期信息名称)、“kf12”(短期信息名称), “F2”(termcap 名称)描述键产生的字符串。试试: tput kf12 | od -tx1
.
由于直接使用功能进行编程可能很麻烦,因此应用程序通常使用更高级别的库,如 curses/ncurses、slang 等...
有一个名为 TERM
的特殊环境变量,它告诉应用程序他们正在与什么终端类型通话。如果数据库中存在此变量,则应将其设置为准确的终端类型,以获得最佳结果。这只是告诉应用程序终端理解哪些精确的协议(protocol)和协议(protocol)偏差。更改 TERM
变量不会更改终端类型,它只会更改应用程序认为正在与之通信的终端类型。
综上所述,Ctrl+arrow
是一种 xterm 行为(取决于配置选项),完全没有反射(reflect)在 terminfo/termcap 数据库中,因此大多数应用程序都不知道它.无论哪种方式,您的终端仿真器(在您的情况下为 pyte
)支持或不支持。
假设您的主要应用程序是 bash
或其他一些使用 readline
库的应用程序,您可以使用 readline 的 backward-word
(默认为 Meta-b/Alt-b/ESC b,可在 inputrc
中配置)。
关于linux - TERM=linux 中 ctrl + 箭头(左、右、...)的终端转义序列是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7767702/