Este script pirateado me funciona por ahora:
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 ] )
Utiliza python-evdev para leer desde /dev/input/foo
y los convierte muy suciamente en valores legibles.
Esto es lo que obtengo cuando ejecuto el script y conecto una tarjeta al lector:
[email protected] ~ $ python test.py
7
6
4
3
f
a
4
6
Aquí hay un truco simple para que funcione fácilmente hasta el próximo arranque, suponiendo que tenga los privilegios necesarios.
El siguiente comando muestra todos los procesos que se ejecutan en la computadora
ps -ef
Para encontrar el PID del proceso de inicio de sesión/getty desde donde se lee actualmente el teclado, podemos pasar los resultados de esta función a través de grep.
ps -ef | grep tty
Podrías ver algo como
root 23698 1 0 18:17 ttyO0 00:00:00 /sbin/getty -L ttyO0 115200 vt102
Tome nota del número en la segunda columna, ese es el PID. Y la sexta columna, que es donde está el teclado.
Para detener ese proceso, use el siguiente comando (sustituyendo el número por cualquiera que sea su PID)
kill -stop 23698
Ahora, puede leer el tty de donde provienen las teclas del teclado (tty se muestra en el comando ps)
cat /dev/ttyO0
El cat
se leerá para siempre, mostrando lo que se ingrese en el teclado, hasta que lo elimine.
Cuando haya terminado y quiera volver al comportamiento normal, puede reanudar la función del teclado con
kill -cont 23698
Por supuesto que perfila la idea general. Puede usar su propio programa para leer desde el tty.
Tuve que hacer esto recientemente para un Hackathon, así que pensé en contribuir con lo que terminamos haciendo.
-
Configure el inicio de sesión automático como root en tty1 (el terminal principal donde el dispositivo de teclado está volcando su entrada). La entrada wiki de Arch Linux tiene buenas instrucciones. Reinicie para que inicie sesión.
-
Copie el código fuente de un pequeño programa conocido como 'ttyEcho'. Se puede encontrar una copia aquí, pero una búsqueda en Google muestra muchas más. Este programa le permite enviar comandos a otro terminal. Compile en la máquina de destino.
-
Ahora que podemos ejecutar lo que sea en /dev/tty1, solo podemos
./ttyEcho -n /dev/tty1 'cat > buffer'
para que todo lo ingresado en tty1 se agregue a un archivo. En lugar de crear un archivo en constante expansión, usemkfifo buffer
primero en generar un archivo especial que es solo una canalización con nombre, una cola FIFO que solo está respaldada por memoria. -
Desde su sesión SSH ahora puede simplemente
tail -f filename
para ver todas las entradas del teclado en tty1. Desde Python,open('filename','r')
y sigue llamando.read()
o.readline()
en él para obtener la fuente de datos del teclado a medida que ingresa.
Este método fue excelente para nosotros, ya que evita el análisis del código de escaneo del teclado y mantiene un búfer grande y agradable de los datos sin ningún código.