Записывать каждое нажатие клавиши и сохранять в файле

Мне нужно записать каждое нажатие клавиши и сохранить в файле в каталоге пользователя ~ при использовании моей учетной записи, я не sudoer, и я не могу установить программы (например, logKeys ). Как я могу сделать это с помощью терминала?

ПРИМЕЧАНИЕ: Этот вопрос не является дубликатом другого вопроса; в этом вопросе я спрашиваю о каждом нажатии клавиши, в то время как в другом вопросе спрашивал о нажатии клавиши на терминальной сессии.

26 голосов | спросил Mitro 13 Mayam14 2014, 11:55:03

2 ответа


38

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) на 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 включен.

Обратите внимание, что вам не нужно иметь привилегии суперпользователя для install программы. Если у вас есть доступ на запись где-нибудь в файловой системе, где предоставляется разрешение на выполнение (ваш домашний каталог, /tmp, /var/tmp ...), то вы можете скопировать команду xinput из совместимой системы и выполнить его.

ответил Stéphane Chazelas 13 Maypm14 2014, 13:25:48
4

Считаете ли вы использование script ?

ответил etherfish 13 Maypm14 2014, 12:13:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132