通过 SSH 连接时,如何读取主机键盘的输入?

通过 SSH 连接时,如何读取主机键盘的输入?

我目前正在试验一种模拟键盘的 RFID 读卡器。当您连接一张卡时,它会从卡中读取数据,然后根据配置模拟按键。

我已将此设备连接到 Raspberry Pi,并通过 SSH 连接到 Raspberry Pi。

显然,当读取器现在模拟击键时,它们会进入 Pi 的本地 tty(而不是我的 SSH 会话)。所以我现在很难获得该输入。

最终,我将编写一个软件来处理输入,但出于调试和开发目的,在我的 SSH 会话中获取键盘输入将非常有帮助。

我尝试了以下

sudo cat /dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd

哪个当我连接卡时会给出一些输出,但这不是我所期望的。这似乎是原始输入数据。我希望将键作为可读值。

从设备读取的数据/dev/input通过管道传输时会更有意义hexdump

pi@raspberrypi ~ $ sudo cat /dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd | hexdump
0000000 eef8 5138 219a 0008 0004 0004 0024 0007
0000010 eef8 5138 21ad 0008 0001 0008 0001 0000
0000020 eef8 5138 21b3 0008 0000 0000 0000 0000
0000030 eef8 5138 6019 0008 0004 0004 0024 0007
0000040 eef8 5138 602a 0008 0001 0008 0000 0000
0000050 eef8 5138 602f 0008 0000 0000 0000 0000
0000060 eef8 5138 9e97 0008 0004 0004 0023 0007
0000070 eef8 5138 9eab 0008 0001 0007 0001 0000
0000080 eef8 5138 9eb1 0008 0000 0000 0000 0000
0000090 eef8 5138 dd18 0008 0004 0004 0023 0007
00000a0 eef8 5138 dd26 0008 0001 0007 0000 0000
00000b0 eef8 5138 dd2b 0008 0000 0000 0000 0000
00000c0 eef8 5138 1b9a 0009 0004 0004 0021 0007
00000d0 eef8 5138 1baf 0009 0001 0005 0001 0000
00000e0 eef8 5138 1bb4 0009 0000 0000 0000 0000
00000f0 eef8 5138 5a15 0009 0004 0004 0021 0007
0000100 eef8 5138 5a24 0009 0001 0005 0000 0000
0000110 eef8 5138 5a29 0009 0000 0000 0000 0000
0000120 eef8 5138 989e 0009 0004 0004 0020 0007
0000130 eef8 5138 98b3 0009 0001 0004 0001 0000
0000140 eef8 5138 98b9 0009 0000 0000 0000 0000
0000150 eef8 5138 d71d 0009 0004 0004 0020 0007
0000160 eef8 5138 d72b 0009 0001 0004 0000 0000
0000170 eef8 5138 d730 0009 0000 0000 0000 0000
0000180 eef8 5138 15a1 000a 0004 0004 0009 0007
0000190 eef8 5138 15b5 000a 0001 0021 0001 0000
00001a0 eef8 5138 15bb 000a 0000 0000 0000 0000
00001b0 eef8 5138 541e 000a 0004 0004 0009 0007
00001c0 eef8 5138 542d 000a 0001 0021 0000 0000
00001d0 eef8 5138 5432 000a 0000 0000 0000 0000
00001e0 eef8 5138 92a3 000a 0004 0004 0004 0007
00001f0 eef8 5138 92b8 000a 0001 001e 0001 0000
0000200 eef8 5138 92be 000a 0000 0000 0000 0000
0000210 eef8 5138 d123 000a 0004 0004 0004 0007
0000220 eef8 5138 d131 000a 0001 001e 0000 0000
0000230 eef8 5138 d136 000a 0000 0000 0000 0000
0000240 eef8 5138 0fab 000b 0004 0004 0021 0007
0000250 eef8 5138 0fbf 000b 0001 0005 0001 0000
0000260 eef8 5138 0fc5 000b 0000 0000 0000 0000
0000270 eef8 5138 4e22 000b 0004 0004 0021 0007
0000280 eef8 5138 4e31 000b 0001 0005 0000 0000
0000290 eef8 5138 4e36 000b 0000 0000 0000 0000
00002a0 eef8 5138 8ca5 000b 0004 0004 0023 0007
00002b0 eef8 5138 8cb9 000b 0001 0007 0001 0000
00002c0 eef8 5138 8cbe 000b 0000 0000 0000 0000
00002d0 eef8 5138 cb2b 000b 0004 0004 0023 0007
00002e0 eef8 5138 cb3a 000b 0001 0007 0000 0000
00002f0 eef8 5138 cb40 000b 0000 0000 0000 0000

应该已输入:7643fa46

答案1

这个拼凑起来的脚本现在对我有用:

import string

from evdev import InputDevice
from select import select

keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
dev = InputDevice('/dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd')

while True:
   r,w,x = select([dev], [], [])
   for event in dev.read():
        if event.type==1 and event.value==1:
                print( keys[ event.code ] )

它用python-evdev读取/dev/input/foo并非常肮脏地将它们转换为可读值。

这是我运行脚本并将卡连接到读卡器时得到的结果:

pi@raspberrypi ~ $ python test.py
7
6
4
3
f
a
4
6

答案2

这里有一个简单的技巧,可以让它轻松工作直到下次启动,假设您拥有所需的权限。

使用以下命令显示计算机上正在运行的所有进程

ps -ef

为了找到当前从中读取键盘的 login/getty 进程的 PID,我们可以将该函数的结果传递给 grep。

ps -ef | grep tty

你会看到类似

root     23698     1  0 18:17 ttyO0    00:00:00 /sbin/getty -L ttyO0 115200 vt102

记下第二列的数字 - 即 PID。第六列是键盘所在的位置。

要停止该过程,请使用以下命令(将数字替换为您的 PID)

kill -stop 23698

现在,你可以读取键盘按键发出的 tty(tty 显示在 ps 命令中)

cat /dev/ttyO0

它将cat永远读取并输出键盘上输入的任何内容,直到您将其杀死。

当你完成操作并希望恢复正常行为时,你可以使用以下命令恢复键盘功能

kill -cont 23698

当然,这只是一个大概的想法。你可以使用自己的程序从 tty 读取。

答案3

最近为了参加 Hackathon 不得不做这件事,所以我想我可以为我们最终做的事情做出贡献。

  1. 在 tty1(键盘设备转储其输入的主终端)上设置以 root 身份自动登录。Arch Linux 维基条目有很好的说明。重新启动即可登录。

  2. 复制名为“ttyEcho”的小程序的源代码。可以找到一份副本这里,但通过 Google 搜索可以找到更多。此程序允许您将命令回显到另一个终端。在目标机器上编译。

  3. 现在我们可以在 /dev/tty1 上运行任何内容,我们只需./ttyEcho -n /dev/tty1 'cat > buffer'将 tty1 上的所有输入添加到文件中即可。无需生成不断扩展的文件,而是mkfifo buffer先使用以下命令生成一个特殊文件,该文件只是一个命名管道 - 一个仅由内存支持的 FIFO 队列。

  4. 现在,您可以从 SSH 会话中tail -f filename查看 tty1 上的所有键盘输入。在 python 中,open('filename','r')继续调用.read().readline()获取键盘数据。

这种方法对我们来说非常有用,因为它避免了键盘扫描码解析,并且在没有任何代码的情况下保留了一个很大的数据缓冲区。

相关内容