GNU/Linux >> Linux Esercitazione >  >> Linux

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

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.

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

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

  3. 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, usa mkfifo buffer prima di generare un file speciale che è solo una pipe con nome, una coda FIFO che è supportata solo dalla memoria.

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


Linux
  1. Come rilevare se la shell è controllata da Ssh?

  2. Come posso determinare l'attuale utilizzo della CPU dalla shell?

  3. Come calcolare l'utilizzo della CPU di un processo tramite PID in Linux da C?

  4. Come posso riservare un blocco di memoria dal kernel Linux?

  5. SSH - Come includere il comando -t nel file ~/.ssh/config

Come eseguire l'SSH sul server tramite Linux

Come leggo l'input di un singolo carattere dalla tastiera usando nasm (assembly) sotto Ubuntu?

Come posso ottenere lo stato della tastiera in Linux?

Come posso ottenere informazioni sul contenitore Docker Linux dall'interno del contenitore stesso?

Come posso fornire una password SSH a SVN sulla riga di comando?

Come posso ottenere la lunghezza di un file video dalla console?