GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich Eingaben von der Tastatur des Hosts lesen, wenn ich über SSH verbunden bin?

Dieses zusammengehackte Skript funktioniert für mich jetzt:

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

Es verwendet python-evdev, um von /dev/input/foo zu lesen und wandelt sie sehr unsauber in lesbare Werte um.

Folgendes erhalte ich, wenn ich das Skript ausführe und eine Karte an das Lesegerät anschließe:

[email protected] ~ $ python test.py
7
6
4
3
f
a
4
6

Hier ist ein einfacher Hack, damit es bis zum nächsten Start problemlos funktioniert, vorausgesetzt, Sie haben die erforderlichen Berechtigungen.

Mit dem folgenden Befehl werden alle Prozesse angezeigt, die auf dem Computer ausgeführt werden

ps -ef

Um die PID des Anmelde-/Getty-Prozesses zu finden, von dem die Tastatur gerade gelesen wird, können wir die Ergebnisse dieser Funktion durch grep übergeben.

ps -ef | grep tty

Sie könnten so etwas wie

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

Notieren Sie sich die Zahl in der zweiten Spalte – das ist die PID. Und die sechste Spalte, in der sich die Tastatur befindet.

Um diesen Prozess anzuhalten, verwenden Sie den folgenden Befehl (ersetzen Sie die Nummer durch Ihre PID)

kill -stop 23698

Jetzt können Sie das tty lesen, von dem die Tastaturtasten kommen (tty wird im ps-Befehl angezeigt)

cat /dev/ttyO0

Die cat liest ewig und gibt aus, was auch immer auf der Tastatur eingegeben wird, bis Sie es beenden.

Wenn Sie fertig sind und zum normalen Verhalten zurückkehren möchten, können Sie die Tastaturfunktion mit

wieder aufnehmen
kill -cont 23698

Das umreißt natürlich die Grundidee. Sie könnten Ihr eigenes Programm verwenden, um aus dem tty zu lesen.


Musste dies kürzlich für einen Hackathon tun, also dachte ich, ich würde zu dem beitragen, was wir am Ende gemacht haben.

  1. Richten Sie die automatische Anmeldung als root auf tty1 ein (dem Hauptterminal, an dem das Tastaturgerät seine Eingabe ausgibt). Der Arch-Linux-Wiki-Eintrag enthält gute Anweisungen. Starten Sie neu, damit es sich anmeldet.

  2. Kopieren Sie den Quellcode eines kleinen Programms namens 'ttyEcho'. Eine Kopie kann hier gefunden werden, aber eine Google-Suche bringt viele weitere hervor. Mit diesem Programm können Sie Befehle an ein anderes Terminal senden. Kompilieren Sie auf dem Zielcomputer.

  3. Jetzt, wo wir alles auf /dev/tty1 ausführen können, können wir einfach ./ttyEcho -n /dev/tty1 'cat > buffer' um alle Eingaben auf tty1 zu einer Datei hinzuzufügen. Anstatt eine immer größer werdende Datei zu erstellen, verwenden Sie mkfifo buffer zuerst eine spezielle Datei zu generieren, die nur eine benannte Pipe ist - eine FIFO-Warteschlange, die nur durch Speicher unterstützt wird.

  4. Aus Ihrer SSH-Sitzung können Sie jetzt nur noch tail -f filename um alle Tastatureingaben auf tty1 zu sehen. Aus Python heraus open('filename','r') und rufen Sie weiterhin .read() an oder .readline() darauf, um den Feed der Tastaturdaten zu erhalten, sobald sie eingehen.

Diese Methode war großartig für uns, da sie das Analysieren des Tastatur-Scancodes vermeidet und einen schönen großen Puffer der Daten ohne Code bereithält.


Linux
  1. Wie kann ich die aktuelle CPU-Auslastung aus der Shell ermitteln?

  2. Wie berechnet man die CPU-Auslastung eines Prozesses durch PID in Linux von C?

  3. Wie kann ich den Tastaturstatus unter Linux abrufen?

  4. Wie kann ich PHP-Code von der Kommandozeile aus ausführen?

  5. Wie bringe ich sed dazu, von der Standardeingabe zu lesen?

So führen Sie SSH zum Server über Linux

Wie kann ich die Länge einer Videodatei von der Konsole abrufen?

Wie kann ich das Layout der Eingabetastatur in der Konsole ändern?

Wie kann ich einen Ordner über die Linux-Befehlszeile kopieren?

Wie kann ich einen Speicherblock aus dem Linux-Kernel reservieren?

Wie kann ich ein Blockgerät von einem Computer auf einen anderen über das Netzwerk als Blockgerät einhängen?