Nagrywaj każde naciśnięcie klawisza i przechowuj w pliku


31

Muszę rejestrować każde naciśnięcie klawisza i przechowywać w pliku w katalogu użytkownika ~, podczas korzystania z mojego konta nie jestem sudoer i nie mogę w żaden sposób instalować programów (takich jak logKeys ). Jak mogę to zrobić za pomocą terminala?

UWAGA: To pytanie nie jest duplikatem drugiego pytania o wzmiankę; w tym pytaniu pytam o każde naciśnięcie klawisza, podczas gdy w drugim pytający pyta o naciśnięcie klawisza w sesji terminalu.


Czy masz na myśli jakikolwiek znak / bajt pochodzący z danego urządzenia końcowego lub jakiekolwiek naciśnięcie / zwolnienie klawisza, nawet z dowolnej klawiatury podłączonej do komputera hosta?
Stéphane Chazelas

Każdy podłączony kryboard
Mitro

2
@ Eterfish nie jest duplikatem, ponieważ nie mam na myśli tylko sesji terminalu, ale każde naciśnięcie klawisza, również na pulpicie, gdy żaden program nie jest uruchomiony.
Mitro

1
W sesji GUI (X11)? Lub na konsoli Linux? Co ma z tym wspólnego terminal, skoro nie chcesz tylko zapisu tego, co wpisałeś w terminalu?
Gilles „SO- przestań być zły”

1
@AlessioMTX Masz rację. Mój błąd.
eteru

Odpowiedzi:


47

xinput testmoże zgłaszać wszystkie zdarzenia związane z klawiaturą na serwerze X. W systemie GNU:

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

Jeśli chcesz uzyskać nazwy kluczy z kodów kluczy, możesz przetworzyć dane wyjściowe za pomocą:

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

Dodaj, > file.logaby przechowywać w pliku dziennika. Lub | tee file.logzalogować się i zobaczyć.

xinputodpytuje XinputExtension serwera X. Jest to tak blisko, jak masz zamiar dostać się jako standard (nie znam żadnego standardu, który obejmowałby narzędzia X) lub wspólne polecenie, aby to zrobić. To również nie wymaga uprawnień roota.

Jeśli serwer X i xinput obsługują wersję XinputExtension w wersji 2, można użyć test-xi2zamiast niej testdaje więcej informacji, w szczególności stan modyfikatorów (shift, ctrl, alt ...). Przykład:

$ 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

Możesz przetłumaczyć kod klucza (in detail) na klucz za pomocą przycisku xmodmap -pke, a effectivemaska ​​bitowa modyfikatora na coś bardziej pomocnego za pomocą xmodmap -pm. Na przykład:

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]"
    }
  }'

wyprowadziłby:

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

kiedy naciskam Shift + Alt + q, gdy włączona jest funkcja num-lock.

Pamiętaj, że nie musisz mieć uprawnień superużytkownika, aby zainstalować program. Jeśli masz dostęp do zapisu w dowolnym miejscu w systemie plików, w którym udzielono uprawnień do wykonywania (katalog domowy /tmp, /var/tmp...), możesz skopiować xinputpolecenie z kompatybilnego systemu i wykonać je.


To jest bardzo dobre, wyjście to naciśnięcie klawisza n1 klawisz naciśnięcie klawisza n2 zwolnienie .. Czy istnieje sposób, aby pokazać literę zamiast liczby? A jak przechowywać w pliku „log”? PS: niestety mój komputer nie ma domyślnie zainstalowanego tego programu i nie mogę w tej chwili nic zainstalować, próbowałem na innym komputerze.
Mitro

Ponadto liczba nie może rozpoznać, jeśli używam 2 lub „
Mitro

2
@AlessioMTX, wszystkie naciśnięcia klawiszy będą rejestrowane, w tym Shift i Capslock. Zobacz także moją edycję, aby znaleźć kluczowe etykiety / symbole zamiast kodów.
Stéphane Chazelas

1
@AlessioMTX, będziesz potrzebować xinput 1.6.1lub nowszego do --root. Narzędzia X można pobrać osobno ze strony xorg.freedesktop.org/releases/indidual/app . Jeśli nie chcesz kompilować ze źródła. Debian ma xinput 1.6.1 dla kilku architektur dla Linuksa lub kfreebsd.
Stéphane Chazelas

1
@AlessioMTX, to jest przeznaczone dla zdarzeń na serwerze X. xmodmapjest w implementacji X odniesienia przynajmniej od 1987 roku. O jakim systemie tutaj mówimy? Czy to możliwe, że xmodmapnie ma go w twoim $PATH( /usr/dt/binlub innym?).
Stéphane Chazelas

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.