使用Python向Linux控制台插入按键输入

7
我最近面临了一个相当奇怪的任务,其中一个结果是需要能够使用DTMF(也称为“触摸音调”)音调来控制一个非X Linux计算机的终端。该计算机具有可以通过ALSA访问的调制解调器,因此我正在通过sox“rec”程序读取输入。所使用的Goertzel算法实现非常好,而eSpeak语音合成引擎是唯一的输出来源;这应该适用于任何触摸音调电话。它会读回输入(输入是八进制数字,每次一个ASCII字节),以及dash shell反馈的任何内容--提示、命令的输出等,使用控制字符的ASCII助记符。该计算机在其他方面完全隔离,没有任何以太网或其他网络接口。
我目前使用与dash及其启动的程序进行交互的方法是pexpect模块。然而,我需要它能够在需要时读取光标所在行的全部内容,我不记得pexpect能够做到这一点(如果可以,我无法判断)。我能想到的唯一其他解决方案是以某种方式使用Python来控制或作为键盘和控制台驱动程序。

这确实是唯一的解决方法吗(如果是,用Python是否可行?),还是有其他直接访问控制台内容的方法?

编辑:令人惊喜的是,我最近发现PExpect的SVN版本具有pexpect.screen。但是,它没有任何实际运行程序的方法。我将密切关注其开发。

2个回答

3
简单的解决方案是使用Linux内核uinput接口。它允许您像物理人机界面设备一样将按键和鼠标事件插入内核。这基本上会将您的应用程序转变为键盘/鼠标。
由于您正在使用Python,我建议您查看python-uinput模块。
如果您熟悉Python中的二进制I/O,则可以在没有任何库的情况下完成相同的操作;只需查看涉及的结构的/usr/include/linux/uinput.h头文件(接口完全稳定),以及一些C语言中的uinput教程
请注意,访问/dev/uinput/dev/input/uinput设备(取决于您的发行版)通常需要root权限。我个人会将Python服务作为专门用于服务的用户和组运行,并修改/添加udev规则(检查rules.d下的所有文件),以允许该组对uinput设备进行读写访问,例如:
SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
KERNEL=="uinput", MODE="0660", GROUP="the-dedicated-group"

然而,如果你的Python应用程序仅执行程序,则应将其作为终端仿真器--例如使用this。你也可以使用Python pty在不使用任何额外库的情况下完成它;主要工作是模拟具有ANSI转义序列的终端,以便应用程序不会混淆,现有的终端仿真器具有此代码。


0
如果您想要操作控制台的内容,您可能需要使用。它有很好的文档在这里。请查看和。

好的,但是我如何在其中运行一个shell(比如 dash)? - mmirate
更准确地说,我如何在不重新实现readline的情况下做到这一点? - mmirate
如果您使用 sh 的唯一目的是使用 readline,那么可以使用 Python 绑定 来实现 readline。 - Anish
除了添加文本(有人想删除文本吗?)之外,我如何操作输入缓冲区? - mmirate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接