GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je lire les entrées du clavier de l'hôte lorsque je suis connecté via SSH ?

Ce script piraté fonctionne pour moi pour le moment :

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

Il utilise python-evdev pour lire à partir de /dev/input/foo et les convertit très salement en valeurs lisibles.

Voici ce que j'obtiens lorsque j'exécute le script et que je connecte une carte au lecteur :

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

Voici un hack simple pour le faire fonctionner facilement jusqu'au prochain démarrage, en supposant que vous ayez les privilèges requis.

L'utilisation de la commande suivante affiche tous les processus en cours d'exécution sur l'ordinateur

ps -ef

Pour trouver le PID du processus login/getty à partir duquel le clavier est actuellement lu, nous pouvons transmettre les résultats de cette fonction via grep.

ps -ef | grep tty

Vous pourriez voir quelque chose comme

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

Prenez note du nombre dans la deuxième colonne - c'est le PID. Et la sixième colonne, où se trouve le clavier.

Pour arrêter ce processus, utilisez la commande suivante (en remplaçant le numéro par votre PID)

kill -stop 23698

Maintenant, vous pouvez lire le tty d'où viennent les touches du clavier (tty est affiché dans la commande ps)

cat /dev/ttyO0

Le cat lira indéfiniment, affichant tout ce qui est entré sur le clavier, jusqu'à ce que vous le tuiez.

Lorsque vous avez terminé et que vous souhaitez revenir au comportement normal, vous pouvez reprendre la fonction du clavier avec

kill -cont 23698

Bien sûr, cela décrit l'idée générale. Vous pouvez utiliser votre propre programme pour lire à partir du tty.


J'ai dû le faire récemment pour un Hackathon, alors j'ai pensé que je contribuerais à ce que nous avons fini par faire.

  1. Configurez l'autologin en tant que root sur tty1 (le terminal principal où le clavier transfère son entrée). L'entrée du wiki Arch Linux contient de bonnes instructions. Redémarrez pour qu'il se connecte.

  2. Copiez la source d'un petit programme connu sous le nom de 'ttyEcho'. Une copie peut être trouvée ici, mais une recherche Google en amène beaucoup plus. Ce programme vous permet de renvoyer des commandes vers un autre terminal. Compilez sur la machine cible.

  3. Maintenant que nous pouvons exécuter n'importe quoi sur /dev/tty1, nous pouvons simplement ./ttyEcho -n /dev/tty1 'cat > buffer' pour que toutes les entrées sur tty1 soient ajoutées à un fichier. Au lieu de créer un fichier en constante expansion, utilisez mkfifo buffer d'abord pour générer un fichier spécial qui est juste un tube nommé - une file d'attente FIFO qui est sauvegardée uniquement par la mémoire.

  4. Depuis votre session SSH, vous pouvez désormais tail -f filename pour regarder toutes les saisies au clavier sur tty1. Depuis Python, open('filename','r') et continuez d'appeler le .read() ou .readline() dessus pour obtenir le flux des données du clavier au fur et à mesure qu'elles arrivent.

Cette méthode était géniale pour nous car elle évite l'analyse du scancode du clavier et conserve un gros tampon de données sans aucun code.


Linux
  1. Comment lire une entrée de caractère unique à partir du clavier à l'aide de nasm (assemblage) sous Ubuntu?

  2. Comment puis-je obtenir des informations sur le conteneur Docker Linux à partir du conteneur lui-même ?

  3. Comment puis-je éviter la vérification d'hôte de SSH pour les hôtes connus ?

  4. Comment puis-je copier la sortie d'une commande à distance dans le presse-papiers local ?

  5. Comment puis-je modifier la disposition du clavier d'entrée dans la console ?

Comment SSH au serveur via Linux

Comment puis-je exécuter du code PHP à partir de la ligne de commande ?

Comment puis-je faire en sorte que sed lise à partir de l'entrée standard?

Comment puis-je fournir un mot de passe SSH à SVN sur la ligne de commande ?

Comment puis-je obtenir la longueur d'un fichier vidéo à partir de la console ?

SSH - Comment inclure la commande -t dans le fichier ~/.ssh/config