Запишіть кожне натискання клавіш і збережіть у файлі


31

Мені потрібно записувати кожне натискання клавіш і зберігати у файлі в каталозі користувачів ~, при використанні мого облікового запису я не судодерж і не можу жодним чином встановлювати програми (наприклад, logKeys ). Як я можу це зробити за допомогою терміналу?

ПРИМІТКА. Це запитання не є дублікатом іншого запитання; в цьому запитанні я запитую про кожен натискання клавіші, тоді як в іншому запитувач запитував про натискання клавіші в термінальному сеансі.


Ви маєте на увазі будь-який ключовий символ / байт, що надходить із заданого термінального пристрою, або будь-яке натискання / звільнення клавіші навіть з будь-якої клавіатури, підключеної до хост-комп'ютера?
Стефан Шазелас

Кожен підключений kryboard
Митро

2
@etherfish це не дублікат, тому що я маю на увазі не тільки термінальний сеанс, а кожне натискання клавіш, також на робочому столі, коли жодна програма не працює.
Мітро

1
У сеансі GUI (X11)? Або на консолі Linux? Що стосується цього терміналу, оскільки ви не хочете лише записувати те, що ви ввели в термінал?
Жил "ТАК - перестань бути злим"

1
@AlessioMTX Ви маєте рацію. Моя помилка.
ефір

Відповіді:


47

xinput testможе повідомляти про всі події клавіатури на сервері X. У системі GNU:

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

Якщо ви хочете отримати ключові імена з ключових кодів, ви можете виконати обробку цього виводу за допомогою:

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

Додати > file.logдля зберігання у файлі журналу. Або | tee file.logв обидва журнали і побачити його.

xinputзапитує XinputExtension X-сервера. Це так близько, як ви збираєтесь отримати як стандарт (я не знаю жодного стандарту, що охоплює X утиліти), або загальної команди для цього. Це також не вимагає привілеїв root.

Якщо X-сервер і xinput підтримують версію 2 XinputExtension, ви можете використовувати test-xi2замість цього дану testдодаткову інформацію, зокрема про стан модифікаторів (shift, ctrl, alt ...). Приклад:

$ 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

Ви можете перевести detailкодовий ключ (in ) в keyym за допомогою xmodmap -pkeзнову, а effectiveбітмаска модифікатора на щось більш корисне за допомогою xmodmap -pm. Наприклад:

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

виведе:

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

коли я натискаю Shift + Alt + q, коли увімкнено num-lock.

Зауважте, що вам не потрібно мати привілеїв суперкористувача для встановлення програми. Якщо у вас є доступ до запису де - то в файлової системі , де виконати дозволи видаються (ваш домашній каталог /tmp, /var/tmp...) , то ви можете скопіювати xinputкоманду з сумісної системи є і виконати його.


Це дуже добре, на виході є натискання клавіші n1, натискання клавіші n2, звільнення клавіш .. Чи існує спосіб показати букву, встановлену цифрою? І як зберігати у файлі "журнал"? PS: на жаль, на моєму ПК не встановлена ​​ця програма за замовчуванням, і я наразі нічого не можу встановити, я спробував на іншому ПК.
Мітро

Більше того, номер не може розпізнати, якщо я використовую 2 або "
Mitro

2
@AlessioMTX, усі натискання клавіш реєструватимуться, хоча й Shift та Capslock. Дивіться також мою редакцію для ключових міток / символів замість кодових клавіш.
Стефан Шазелас

1
@AlessioMTX, вам знадобиться xinput 1.6.1чи новіше для --root. X утиліти можна завантажити окремо з xorg.freedesktop.org/releases/individual/app . Якщо ви не хочете компілювати з джерела. У Debian є xinput 1.6.1 для декількох архітектур для Linux або kfreebsd.
Стефан Шазелас

1
@AlessioMTX, це призначено для подій на X-сервері. xmodmapпринаймні з 1987 року перебуває у еталонному впровадженні X. Про яку систему ми говоримо тут? Можливо, цього xmodmapнемає у вашому $PATH( /usr/dt/binчи іншому?).
Стефан Шазелас

3

Ви розглядали можливість використання scriptкоманди?


Це не те, що я шукаю. Я читаю за посиланням, але це лише для термінального сеансу.
Мітро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.