GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo leer la entrada del teclado del host cuando estoy conectado a través de SSH?

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.

  1. 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.

  2. 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.

  3. 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, use mkfifo buffer primero en generar un archivo especial que es solo una canalización con nombre, una cola FIFO que solo está respaldada por memoria.

  4. 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.


Linux
  1. ¿Cómo puedo determinar la utilización actual de la CPU desde el shell?

  2. ¿Cómo calcular el uso de CPU de un proceso por PID en Linux desde C?

  3. ¿Cómo puedo ejecutar código PHP desde la línea de comandos?

  4. ¿Cómo hago para que sed lea desde la entrada estándar?

  5. ¿Cómo puedo proporcionar una contraseña SSH a SVN en la línea de comandos?

Cómo SSH al servidor a través de Linux

¿Cómo puedo obtener la duración de un archivo de video desde la consola?

¿Cómo puedo copiar la salida de un comando remoto en el portapapeles local?

¿Cómo puedo cambiar el diseño del teclado de entrada mientras estoy en la consola?

¿Cómo puedo reservar un bloque de memoria del kernel de Linux?

SSH:cómo incluir el comando -t en el archivo ~/.ssh/config