Questo script messo insieme funziona per me per ora:
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 da /dev/input/foo
e li converte in modo molto sporco in valori leggibili.
Questo è ciò che ottengo quando eseguo lo script e collego una scheda al lettore:
[email protected] ~ $ python test.py
7
6
4
3
f
a
4
6
Ecco un semplice trucco per farlo funzionare facilmente fino al prossimo avvio, assumendo che tu abbia i privilegi richiesti.
L'utilizzo del seguente comando mostra tutti i processi in esecuzione sul computer
ps -ef
Per trovare il PID del processo login/getty da dove viene attualmente letta la tastiera, possiamo passare i risultati di questa funzione tramite grep.
ps -ef | grep tty
Potresti vedere qualcosa come
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, dove si trova la tastiera.
Per interrompere quel processo, usa il seguente comando (sostituendo il numero per qualunque sia il tuo PID)
kill -stop 23698
Ora puoi leggere il tty da dove arrivano i tasti della tastiera (tty è mostrato nel comando ps)
cat /dev/ttyO0
Il cat
leggerà per sempre, emettendo tutto ciò che è stato digitato sulla tastiera, fino a quando non lo uccidi.
Quando hai finito e vuoi tornare al comportamento normale, puoi riprendere la funzione della tastiera con
kill -cont 23698
Ovviamente questo delinea l'idea generale. Potresti usare il tuo programma per leggere dal tty.
Ho dovuto farlo di recente per un Hackathon, quindi ho pensato di contribuire a quello che abbiamo finito per fare.
-
Imposta il login automatico come root su tty1 (il terminale principale in cui il dispositivo della tastiera sta scaricando il suo input). La voce wiki di Arch Linux contiene buone istruzioni. Riavvia per farlo accedere.
-
Copia il sorgente di un piccolo programma noto come 'ttyEcho'. Una copia può essere trovata qui, ma una ricerca su Google ne fa apparire molte altre. Questo programma consente di inviare i comandi a un altro terminale. Compilare sulla macchina di destinazione.
-
Ora che possiamo eseguire qualunque cosa su /dev/tty1, possiamo solo
./ttyEcho -n /dev/tty1 'cat > buffer'
per ottenere tutto l'input su tty1 da aggiungere a un file. Invece di creare un file in continua espansione, usamkfifo buffer
prima di generare un file speciale che è solo una pipe con nome, una coda FIFO che è supportata solo dalla memoria. -
Dalla tua sessione SSH ora puoi solo
tail -f filename
per guardare tutti gli input da tastiera su tty1. Dall'interno di 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 del codice di scansione della tastiera e mantiene un bel buffer di dati senza alcun codice.