在 Python 中使用 TIOCSTI 将组合键注入 Bash tty

Posted

技术标签:

【中文标题】在 Python 中使用 TIOCSTI 将组合键注入 Bash tty【英文标题】:Injecting key combinations into Bash tty using TIOCSTI in Python 【发布时间】:2017-04-10 08:18:18 【问题描述】:

我正在尝试使用 Python 中的 TIOCSTI 将组合键(如 ALT+.)注入 tty。

对于某些组合键,我使用以下 table 找到了 Bash shell 的相应十六进制代码,效果很好。

从这个表中我可以看到例如 CTRL+A'\x01' 等等。

import sys,os,Queue
import termios,fcntl
# replace xx with a tty num
tty_name = "/dev/pts/xx";
parent_fd = os.open(tty_name, os.O_RDWR)

special_char = "Ctrl_a"

if special_char == "Ctrl_a":
   send_char = '\x01'
if special_char == "Ctrl_e":
   send_char = '\x05'
if special_char == "Ctrl_c":
   send_char = '\x03'

fcntl.ioctl(self.parent_fd, termios.TIOCSTI, send_char)

但是我怎样才能获得其他组合的十六进制代码,例如 ALT+f 等。我需要一个完整的列表或方法来获取任何可能的组合的此信息,因为我想实现大多数 bash 快捷方式来移动、操纵历史等注入。

或者有没有其他方法可以使用 TIOCSTI 注入组合键?

由于我只能将单个字符发送到 tty,所以我想知道是否还有其他可能。

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

“控制代码”的通常工作是“控制”修饰符从字符代码中减去 64。

“A”是 ASCII 字符 65,所以“Ctrl-A”是“65-64=1”。 您是否可以将此方案扩展到您的情况?

因此,如果您需要控制代码,例如“Device Control 4”(ASCII 代码 20),您需要添加 64,以获得“84”,即“T”。 因此,DC4 的控制代码将是“Control+T”。 反方向,“Control+R”(BASH中的历史搜索)的值为R-64,所以82-64=18(设备控制2)

ASCIItable.com 可以帮助完整列出 ASCII 中的所有字符代码

更新:由于您专门要求“alt+.”: 不幸的是,“控制平均值负 64”不适用于 Alt;键盘驱动程序通过生成“键码”(也称为“扫描码”,可变地写入或不带空格)来处理这似乎完全不同不一定映射到 ASCII。(键码只是发生映射到 0-9 和 A-Z 的 ASCII,这会导致很多混乱)

This page 列出了更多的键码,包括“alt+.”的“155”

【讨论】:

以上是关于在 Python 中使用 TIOCSTI 将组合键注入 Bash tty的主要内容,如果未能解决你的问题,请参考以下文章

将 Python 字典排列组合到字典列表中

找出给定键组合的相应转义序列

组合键与 ENTER 键

将字典中具有相同值的所有键组合在一起,并将键与值交换,将值与键交换

emacs 的使用:哪些是真正有用的组合键

Python+Selenium练习篇之12-组合键-退格键删除文字/鼠标右键