GNU/Linux >> Znalost Linux >  >> Linux

Zaznamenat každý stisk klávesy a uložit do souboru?

Potřebuji zaznamenat každé stisknutí klávesy a uložit v souboru v uživatelském adresáři ~, když používám svůj účet, nejsem sudoer a nemohu žádným způsobem instalovat programy (jako logKeys). Jak to mohu provést pomocí terminálu?

POZNÁMKA: Tato otázka není duplikátem jiné zmíněné otázky; v této otázce se ptám na každý úhoz, zatímco v druhé se tazatel ptá na úhoz v terminálové relaci.

Přijatá odpověď:

xinput test může hlásit všechny události klávesnice na X server. Na systému GNU:

xinput list |
  grep -Po 'id=Kd+(?=.*slaves*keyboard)' |
  xargs -P0 -n1 xinput test

Pokud chcete získat názvy klíčů z kódů klíčů, můžete výstup zpracovat pomocí:

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

Přidejte > file.log uložit do souboru protokolu. Nebo | tee file.log zalogovat a zobrazit.

xinput dotazuje XinputExtension X serveru. To je tak blízko, jak se dostanete jako standard (nejsem si vědom žádného standardu, který by pokryl nástroje X) nebo běžný příkaz k tomu. To také nevyžaduje oprávnění root.

Pokud X server a xinput podporují verzi 2 XinputExtension, můžete použít test-xi2 místo test který poskytuje více informací, zejména stav modifikátorů (shift, ctrl, alt…). Příklad:

$ 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

Kód klíče můžete přeložit (v detail ) na keysym pomocí xmodmap -pke znovu a effective modifikátor bitmask na něco užitečnějšího s pomocí xmodmap -pm . Například:

xinput test-xi2 --root | perl -lne '
  BEGIN{$"=",";
    open X, "-|", "xmodmap -pke";
    while (<X>) {$k{$1}=$2 if /^keycodes+(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]"
    }
  }'

bude výstup:

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

když stisknu Shift+Alt+q, když je num-lock zapnutý.

Upozorňujeme, že k instalaci nepotřebujete oprávnění superuživatele program. Pokud máte přístup k zápisu někam v souborovém systému, kde je uděleno oprávnění ke spuštění (váš domovský adresář, /tmp , /var/tmp …) pak můžete zkopírovat xinput příkaz z kompatibilního systému tam a spusťte jej.

Související:Ssh – Jak zrychlit příliš pomalé přihlašování ssh?
Linux
  1. Superblock, Inode, Dentry a soubor?

  2. Náhrada procesu a potrubí?

  3. Instalace a konfigurace vsFTPD

  1. Vlákna a deskriptory souborů

  2. unix - hlava A konec souboru

  3. Uložte výstup příkazu data a watch do souboru

  1. `^m` A jak se toho zbavit?

  2. Jak Globovat každý skrytý soubor kromě aktuálního a nadřazeného adresáře?

  3. Připojování fstab a cifs, je možné ukládat ověřovací informace mimo fstab?