Wie kann ich Eingaben von der Host-Tastatur lesen, wenn eine Verbindung über SSH besteht?

10

Ich experimentiere derzeit mit einem RFID-Kartenleser, der eine Tastatur emuliert. Wenn Sie eine Karte anschließen, liest sie Daten aus und emuliert dann je nach Konfiguration Tastenanschläge.

Ich habe dieses Gerät an einen Raspberry Pi angeschlossen und über SSH mit dem Raspberry Pi verbunden.

Wenn der Leser jetzt Tastenanschläge emuliert, landen sie offensichtlich auf der lokalen tty des Pi (und nicht in meiner SSH-Sitzung). Daher fällt es mir gerade schwer, an diesen Eingang zu gelangen.

Letztendlich werde ich eine Software schreiben, um die Eingabe zu verarbeiten, aber für Debugging- und Entwicklungszwecke wäre es sehr hilfreich, die Tastatureingabe in meiner SSH-Sitzung zu erhalten.

Ich habe folgendes versucht

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

Das gibt zwar eine Ausgabe, wenn ich eine Karte anschließe, aber es ist nicht das, was ich erwartet hätte. Es scheint, dass dies rohe Eingabedaten wären. Ich würde gerne die Schlüssel als lesbare Werte erhalten.

Die Daten, die vom /dev/inputGerät gelesen werden, sind beim Durchleiten etwas sinnvoller 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

Das hätte der Input sein sollen:7643fa46

Der Hochstapler
quelle
Wenn ich Ihre Frage verstehe, würde ich vermuten, dass sie im technischen Sinne sehr wenig mit ssh zu tun hat, und Sie möchten eine Art Keylogger, der möglicherweise in C geschrieben ist und auf dem Zielcomputer ausgeführt wird, und dann fragen Sie ihn ab wenn Sie zum Zielcomputer ssh.
Barlop
@barlop: Wenn ich das tun müsste, um das zu erreichen, was ich will, dann ist es nicht das, was ich tun möchte. Ich muss "etwas" schreiben, um die Eingabe am Ende tatsächlich zu erfassen. Ich hatte nur auf einen schnellen Ansatz gehofft, der es mir ermöglicht, dieses Setup in seinem aktuellen Zustand zu testen.
Der Hochstapler
Es wäre ein erstaunliches Sicherheitsrisiko, wenn ssh eine Funktion dafür bereitstellen würde, und ich bezweifle, dass es eine native App gibt, die standardmäßig mit der Distribution des Zielcomputers gebündelt ist.
Barlop
1
@barlop: Nun, ich erwarte nicht, dass es ohne Superuser-Berechtigungen funktioniert, das ist sicher.
Der Hochstapler

Antworten:

7

Dieses gehackte Skript funktioniert vorerst für mich:

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 ] )

Es verwendet Python-Evdev zum Lesen /dev/input/foound konvertiert sie sehr schmutzig in lesbare Werte.

Folgendes erhalte ich, wenn ich das Skript ausführe und eine Karte mit dem Lesegerät verbinde:

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

Hier ist ein einfacher Hack, damit es bis zum nächsten Start problemlos funktioniert, vorausgesetzt, Sie haben die erforderlichen Berechtigungen.

Mit dem folgenden Befehl werden alle auf dem Computer ausgeführten Prozesse angezeigt

ps -ef

Um die PID des Login / Getty-Prozesses zu ermitteln, von dem aus die Tastatur gerade gelesen wird, können wir die Ergebnisse dieser Funktion über grep übergeben.

ps -ef | grep tty

Sie konnten so etwas sehen

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

Notieren Sie sich die Nummer in der zweiten Spalte - das ist die PID. Und die sechste Spalte, in der sich die Tastatur befindet.

Verwenden Sie den folgenden Befehl, um diesen Vorgang anzuhalten (ersetzen Sie Ihre PID durch die Nummer).

kill -stop 23698

Jetzt können Sie die tty lesen, von der die Tastaturtasten kommen (tty wird im Befehl ps angezeigt).

cat /dev/ttyO0

Das catwird für immer lesen und alles ausgeben, was auf der Tastatur eingegeben wird, bis Sie es töten.

Wenn Sie fertig sind und zum normalen Verhalten zurückkehren möchten, können Sie die Tastaturfunktion mit fortsetzen

kill -cont 23698

Das umreißt natürlich die allgemeine Idee. Sie können Ihr eigenes Programm verwenden, um aus dem tty zu lesen.

user277209
quelle
Wenn ich den / sbin / getty-Prozess beende, wird er automatisch neu
gestartet
1

Musste dies kürzlich für einen Hackathon tun, also dachte ich mir, ich würde dazu beitragen, was wir letztendlich getan haben.

  1. Richten Sie die Autologin als Root auf tty1 ein (dem Hauptterminal, an dem das Tastaturgerät seine Eingaben speichert). Der Arch Linux Wiki-Eintrag enthält gute Anweisungen. Starten Sie neu, damit es sich anmeldet.

  2. Kopieren Sie die Quelle eines kleinen Programms namens 'ttyEcho'. Eine Kopie finden Sie hier , aber eine Google-Suche bringt noch viel mehr hervor. Mit diesem Programm können Sie Befehle an ein anderes Terminal zurücksenden. Kompilieren Sie auf dem Zielcomputer.

  3. Jetzt, da wir alles auf / dev / tty1 ausführen können, können wir einfach alle ./ttyEcho -n /dev/tty1 'cat > buffer'Eingaben auf tty1 zu einer Datei hinzufügen. Anstatt eine ständig wachsende Datei zu erstellen, mkfifo buffergenerieren Sie zunächst eine spezielle Datei, die nur eine Named Pipe ist - eine FIFO-Warteschlange, die nur vom Speicher unterstützt wird.

  4. Von Ihrer SSH-Sitzung aus können Sie jetzt tail -f filenamealle Tastatureingaben auf tty1 anzeigen. open('filename','r')Rufen Sie in Python an .read()oder rufen Sie .readline()es an, um den Feed der Tastaturdaten zu erhalten, sobald sie eingehen.

Diese Methode war großartig für uns, da sie das Parsen von Tastatur-Scancodes vermeidet und einen schönen großen Puffer der Daten ohne Code enthält.

Marc J.
quelle