Come posso leggere l'input dalla tastiera degli host quando connesso tramite SSH?


10

Attualmente sto sperimentando un lettore di schede RFID che emula una tastiera. Quando si collega una scheda, leggerà i dati da essa e quindi emulerà le sequenze di tasti in base alla configurazione.

Ho collegato questo dispositivo a un Raspberry Pi e collegato a Raspberry Pi tramite SSH.

Ovviamente, quando il lettore ora emula i tasti, atterra sulla tty locale del Pi (e non nella mia sessione SSH). Quindi sto facendo fatica a ottenere questo input proprio ora.

Alla fine, scriverò un software per gestire l'input, ma per scopi di debug e sviluppo, sarebbe molto utile ottenere l'input da tastiera nella mia sessione SSH.

Ho provato quanto segue

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

Il che fa dare qualche uscita quando si collega una scheda, ma non è quello che mi sarei aspettato. Sembra che sarebbero dati di input non elaborati. Mi piacerebbe avere le chiavi come valori leggibili.

I dati che vengono letti dal /dev/inputdispositivo hanno un po 'più senso quando si esegue il piping attraverso 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

Quello avrebbe dovuto essere l'input:7643fa46


se capisco la tua domanda, immagino che in senso tecnico abbia molto poco a che fare con ssh, e vorresti qualche tipo di keylogger magari scritto in C, in esecuzione sul computer di destinazione, e poi lo interroghi quando si invia al computer di destinazione.
barlop

@barlop: Se dovessi fare che per ottenere ciò che voglio, allora non è quello che voglio fare. Dovrò scrivere "qualcosa" per afferrare effettivamente l'input alla fine, speravo solo in un approccio rapido che mi permettesse di testare questa configurazione nel suo stato attuale.
Der Hochstapler,

sarebbe un rischio per la sicurezza incredibile se ssh fornisse una funzione per farlo, e dubito che ci sia un'app nativa in bundle con la distribuzione di dest comp per impostazione predefinita.
barlop

1
@barlop: Beh, non mi aspetto che funzioni senza i privilegi di superutente, questo è certo.
Der Hochstapler,

Risposte:


8

Per ora questo script hackerato funziona per me:

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

Usa python-evdev per leggere /dev/input/fooe li converte in modo molto sporco in valori leggibili.

Questo è ciò che ottengo quando eseguo lo script e connetto una scheda al lettore:

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

4

Ecco un semplice trucco per farlo funzionare facilmente fino all'avvio successivo, supponendo che tu abbia i privilegi richiesti.

L'uso del comando seguente mostra tutti i processi in esecuzione sul computer

ps -ef

Per trovare il PID del processo login / getty da cui la tastiera è attualmente letta, possiamo passare i risultati di questa funzione tramite grep.

ps -ef | grep tty

Potresti vedere qualcosa del genere

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

Prendi nota del numero nella seconda colonna, ovvero il PID. E la sesta colonna, che è dove si trova la tastiera.

Per interrompere tale processo, utilizzare il seguente comando (sostituendo il numero per qualunque sia il PID)

kill -stop 23698

Ora puoi leggere tty da dove provengono i tasti della tastiera (tty è mostrato nel comando ps)

cat /dev/ttyO0

La catleggerà per sempre, emettendo tutto ciò che viene inserito sulla tastiera, fino a quando non lo uccidi.

Quando hai finito e vuoi tornare al normale comportamento, puoi riprendere la funzione della tastiera con

kill -cont 23698

Naturalmente questo delinea l'idea generale. È possibile utilizzare il proprio programma per leggere dal tty.


Quando
interrompo il

2

Ho dovuto farlo di recente per un Hackathon, quindi ho pensato che avrei contribuito a quello che abbiamo finito per fare.

  1. Imposta autologin come root su tty1 (il terminale principale in cui il dispositivo tastiera sta scaricando il suo input). La voce wiki di Arch Linux contiene buone istruzioni. Riavvia per farlo accedere.

  2. Copia l'origine di un piccolo programma noto come "ttyEcho". Una copia può essere trovata qui , ma una ricerca su Google ne evidenzia molte altre. Questo programma consente di eseguire l'eco dei comandi su un altro terminale. Compilare sulla macchina target.

  3. Ora che possiamo eseguire qualunque cosa su / dev / tty1, possiamo solo ./ttyEcho -n /dev/tty1 'cat > buffer'ottenere tutto l'input su tty1 da aggiungere a un file. Invece di creare un file in continua espansione, utilizzare mkfifo bufferprima per generare un file speciale che è solo una pipe denominata, una coda FIFO supportata solo dalla memoria.

  4. Dalla tua sessione SSH ora puoi semplicemente tail -f filenameguardare tutti gli input da tastiera su tty1. Da Python, open('filename','r')e continua a chiamare .read()o .readline()su di esso per ottenere il feed dei dati della tastiera non appena arrivano.

Questo metodo è stato ottimo per noi poiché evita l'analisi dello scancode della tastiera e mantiene un bel buffer di grandi dimensioni dei dati senza alcun codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.