从Python将键盘插入Linux控制台

mmi*_*ate 7 python linux keyboard console dtmf

我最近遇到了一个相当奇怪的任务,一个结果是必须能够使用DTMF(又名"Touch Tone")音调来控制非X Linux计算机的终端.计算机有一个调制解调器,可以通过ALSA访问,因此sox"rec"程序,这是我正在读取输入.有问题的计算机完全隔离,没有任何以太网或其他网络接口.我正在使用的Goertzel算法实现效果非常好,eSpeak语音合成引擎也是唯一的输出源; 这适用于任何Touch Tone手机.它读回两个输入(输入是八进制数字,一次一个ASCII字节)和dashshell反馈的任何内容 - 提示,命令输出等,使用ASCII助记符作为控制字符.

我用来与之交互的当前方法dash和通过它启动的程序是pexpect模块.但是,我需要它能够按需读回光标所在行的全部内容,而且我不记得pexpect能够这样做(如果是,我不知道.).我能想到的唯一其他解决方案是以某种方式使用Python来控制或充当键盘和控制台驱动程序.

这确实是唯一可行的方法(如果是这样,甚至可以用Python吗?),还是有另一种直接访问控制台内容的方法?

编辑:通过愚蠢的运气,我刚刚发现PExpect的SVN版本有pexpect.screen.但是,它没有任何实际运行程序的方法.我必须密切关注它的发展.

Nom*_*mal 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"
Run Code Online (Sandbox Code Playgroud)

但是,如果您的 Python 应用程序只是执行程序,则应该将其设为终端模拟器 - 例如,使用. 您也可以使用 Python pty来完成此操作,无需任何额外的库;然而,主要工作是用 ANSI 转义序列模拟终端,这样应用程序就不会混淆,现有的终端模拟器有这样的代码。