Enregistrer chaque frappe et stocker dans un fichier

31

J'ai besoin d'enregistrer chaque frappe et de le stocker dans un fichier dans le répertoire utilisateur ~, lorsque j'utilise mon compte, je ne suis pas sudoer et je ne peux en aucun cas installer des programmes (comme logKeys ). Comment pourrais-je le faire en utilisant un terminal?

REMARQUE: cette question n'est pas un doublon de l'autre question mentionnée; dans cette question, je demande à propos de chaque frappe, tandis que dans l'autre, le demandeur a posé des questions sur la frappe dans la session de terminal.

Mitro
la source
Voulez-vous dire tout caractère / octet clé provenant d'un terminal donné, ou toute pression / relâchement de touche, même à partir d'un clavier connecté à l'ordinateur hôte?
Stéphane Chazelas
Chaque kryboard connecté
Mitro
2
@etherfish ce n'est pas un doublon car, je ne parle pas seulement de la session de terminal, mais de chaque frappe, également sur le bureau, quand aucun programme n'est en cours d'exécution.
Mitro
1
Dans une session GUI (X11)? Ou sur une console Linux? Qu'est-ce qu'un terminal a à voir avec cela, puisque vous ne voulez pas seulement un enregistrement de ce que vous avez tapé dans un terminal?
Gilles 'SO- arrête d'être méchant'
1
@AlessioMTX Vous avez raison. Mon erreur.
etherfish

Réponses:

47

xinput testpeut signaler tous les événements du clavier au serveur X. Sur un système GNU:

xinput list |
  grep -Po 'id=\K\d+(?=.*slave\s*keyboard)' |
  xargs -P0 -n1 xinput test

Si vous souhaitez obtenir des noms de clé à partir des codes de clé, vous pouvez post-traiter cette sortie avec:

awk 'BEGIN{while (("xmodmap -pke" | getline) > 0) k[$2]=$4}
     {print $0 "[" k[$NF] "]"}'

Ajouter > file.logpour stocker dans un fichier journal. Ou | tee file.logpour vous connecter et le voir.

xinputinterroge la XinputExtension du serveur X. C'est aussi proche que possible de la norme (je ne connais aucune norme qui couvre les utilitaires X) ou d'une commande commune pour le faire. Cela ne nécessite pas non plus de privilèges root.

Si le serveur X et xinput prennent en charge la version 2 de XinputExtension, vous pouvez utiliser à la test-xi2place de testqui donne plus d'informations, notamment l'état des modificateurs (shift, ctrl, alt ...). Exemple:

$ xinput test-xi2 --root
EVENT type 2 (KeyPress)
    device: 11 (11)
    detail: 54
    flags:
    root: 846.80/451.83
    event: 846.80/451.83
    buttons:
    modifiers: locked 0 latched 0 base 0x4 effective: 0x4
    group: locked 0 latched 0 base 0 effective: 0
    valuators:
    windows: root 0x26c event 0x26c child 0x10006e6

Vous pouvez traduire le keycode (in detail) en un keysym à l'aide de xmodmap -pkenouveau, et le effectivebitmask de modification en quelque chose de plus utile avec l'aide de xmodmap -pm. Par exemple:

xinput test-xi2 --root | perl -lne '
  BEGIN{$"=",";
    open X, "-|", "xmodmap -pke";
    while (<X>) {$k{$1}=$2 if /^keycode\s+(\d+) = (\w+)/}
    open X, "-|", "xmodmap -pm"; <X>;<X>;
    while (<X>) {if (/^(\w+)\s+(\w*)/){($k=$2)=~s/_[LR]$//;$m[$i++]=$k||$1}}
    close X;
  }
  if (/^EVENT type.*\((.*)\)/) {$e = $1}
  elsif (/detail: (\d+)/) {$d=$1}
  elsif (/modifiers:.*effective: (.*)/) {
    $m=$1;
    if ($e =~ /^Key/){
      my @mods;
      for (0..$#m) {push @mods, $m[$_] if (hex($m) & (1<<$_))}
      print "$e $d [$k{$d}] $m [@mods]"
    }
  }'

produirait:

KeyPress 24 [q] 0x19 [Shift,Alt,Num_Lock]

lorsque j'appuie sur Maj + Alt + q lorsque le verrouillage numérique est activé.

Notez que vous n'avez pas besoin de privilèges de super-utilisateur pour installer un programme. Si vous avez accès en écriture à quelque part sur le système de fichiers où l' autorisation d' exécution est accordé (votre répertoire personnel, /tmp, /var/tmp...) , vous pouvez copier une xinputcommande à partir d' un système compatible et il l' exécuter.

Stéphane Chazelas
la source
C'est très bon, la sortie est la touche Appuyez sur la touche n1 Appuyez sur la touche n2 Relâchez-vous. Et comment stocker dans un fichier le "log"? PS: malheureusement mon PC n'a pas ce programme installé par défaut, et je ne peux rien installer pour le moment, j'ai essayé sur un autre PC.
Mitro
De plus, le nombre ne peut pas reconnaître si j'utilise 2 ou "
Mitro
2
@AlessioMTX, toutes les pressions sur les touches seront enregistrées, y compris les touches Shift et Capslock. Voir aussi ma modification pour les étiquettes / symboles clés au lieu des codes clés.
Stéphane Chazelas
1
@AlessioMTX, vous en aurez besoin xinput 1.6.1ou plus récent --root. Les utilitaires X peuvent être téléchargés individuellement sur xorg.freedesktop.org/releases/individual/app . Si vous ne voulez pas compiler depuis la source. Debian a un xinput 1.6.1 pour plusieurs architectures pour Linux ou kfreebsd.
Stéphane Chazelas
1
@AlessioMTX, destiné aux événements sur le serveur X. xmodmapest dans l'implémentation de référence X depuis 1987 au moins. De quel système parlons-nous ici? Serait-ce que ce xmodmapn'est pas dans votre $PATH( /usr/dt/binou autre?).
Stéphane Chazelas
3

Avez-vous envisagé d'utiliser la scriptcommande?

etherfish
la source
Ce n'est pas ce que je recherche. J'ai lu le lien mais ce n'est que pour la session de terminal.
Mitro