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


10

我目前正在尝试模拟键盘的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


如果我理解您的问题,我想从技术意义上讲,它与ssh几乎没有关系,并且您想要某种用C语言编写的,在目标计算机上运行的键盘记录程序,然后对其进行查询SSH到目标计算机时。
barlop

@barlop:如果我必须做的是,以达到我想要的,那么它是不是我想做的事情。最后,我将不得不编写“东西”来实际获取输入,我只是希望有一种快速的方法,可以让我在当前状态下测试此设置。
Der Hochstapler 2013年

如果ssh提供了执行此功能的功能,那么这将带来惊人的安全风险,而且我怀疑默认情况下是否将本机应用程序与dest comp的发行版捆绑在一起。
barlop

1
@barlop:是的,我可以肯定的是,没有超级用户权限,它就无法运行。
Der Hochstapler 2013年

Answers:


8

这个被黑的脚本现在对我有用:

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

4

假设您具有必需的特权,这是一个简单的技巧,可使其在下次启动之前轻松工作。

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

ps -ef

要从当前读取键盘的位置查找登录/获取过程的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(ps命令中显示了tty)

cat /dev/ttyO0

cat会永远读,在键盘上输入的任何输出,直到你杀了它。

完成后,要恢复正常行为,可以使用以下命令恢复键盘功能:

kill -cont 23698

当然,这概述了总体思路。您可以使用自己的程序来读取tty。


当我杀死/ sbin / getty进程时,它会自动重新启动
davidgyoung

2

最近不得不在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()对其进行调用,以获取传入的键盘数据的提要。

该方法对我们来说非常有用,因为它避免了键盘扫描代码的解析,并在没有任何代码的情况下保持了很好的数据缓冲。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.