在 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的主要内容,如果未能解决你的问题,请参考以下文章