【问题标题】:How can I capture keyboard events and use a monitor as a text-display on Linux?如何在 Linux 上捕获键盘事件并将监视器用作文本显示?
【发布时间】:2015-08-18 02:16:39
【问题描述】:

我有一台以多用户模式运行的服务器,它连接到键盘和显示器。在另一台计算机上,我想通过 SSH 连接到服务器并运行一个程序,该程序从键盘捕获输入并将文本打印到显示器。键盘和显示器永远不会用于任何其他目的。

现在,当服务器启动时,显示器上会显示一个(文本)登录屏幕。我知道我可以写入相应的/dev/tty 设备。但是,键盘也会写入同一个地方。

如何在 Linux 上捕获键盘事件并将监视器用作文本显示器?

我可能缺少一些关于 Linux 上硬件接口的基础知识。我需要知道什么?

赏金时间不多了 - 如果有人想进一步充实这一点,我将相应奖励:

我执行了以下操作以防止任何登录程序启动:

systemctl mask serial-getty@ttyO0
systemctl mask systemd-logind
systemctl mask getty@tty1

然后我在需要时运行我的程序:

openvt -c 1 -f /path/to/my/program

这将是一个完全令人满意的解决方案,除了那个讨厌的 -ftty1 上正在运行什么?我能做些什么来阻止它吗?我应该阻止它吗?

值得注意的是,这个解决方案确实满足了我的所有需求——据我了解,我正在接管 tty,从而可以访问它的标准输入(从键盘接收输出)和标准输出(打印到监视器)。

【问题讨论】:

  • 为什么不让 sshd 在登录时运行适当的程序?
  • 你能详细说明一下吗?我看不出“如何启动程序”和“程序如何实现其目标”之间的联系。
  • 哦,我明白了。您要连接的键盘和显示器已连接到 服务器。这就是openvt 的用途。
  • 您可以替换显示登录提示并等待键盘输入的程序。这样,您的程序将控制控制台终端(您的程序写入其标准输出的内容将显示在控制台上,您在键盘上键入的内容将输入程序的标准输入)而不是原始程序在那里。
  • 好的,因此在 systemd 系统上的起点是禁用 getty@tty1.service 并编辑 /etc/systemd/logind.conf 以设置 NAutoVTs=0ReserveVT=0。现在没有登录提示将处于活动状态,我可以写信给/dev/tty0 来打印我想要的内容。那么我怎样才能看到键盘连接到什么? (例如,Alt-F2 仍会尝试更改为 tty2)。

标签: linux keyboard hardware-interface


【解决方案1】:

如果您愿意进行低级编程,则不必处理标准输入或标准输出。只需直接与键盘设备和控制台设备对话即可。

input-utilsinput-events的源码。它使用原始数据来读取键盘、鼠标或任何其他输入设备。

为了避免键盘的默认处理,它使用 grab 模式(CLI 中的-g),转换为:

ioctl(fd,EVIOCGRAB,1)

在设备文件描述符中。从/dev/input/event* 读取原始事件或多或少很简单:#include <linux/input.h>,执行抓取操作,然后从设备读取struct input_event 结构。

要写信到控制台,如果你不想搞乱TTY的疯狂,现在你处于低级模式,你可能更喜欢直接写信给/dev/vcs,或者/dev/vcsa获取颜色( a 用于属性)输出。

基本上vcs 的每个屏幕单元格有一个字节,其中包含所显示字符的代码。在vcs 中有两个字节:字符和属性。详情请见man vcs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2011-08-21
    • 1970-01-01
    • 2015-08-14
    • 2016-07-14
    • 2012-08-06
    相关资源
    最近更新 更多