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


31

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

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


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

Каждый подключенный крифборд
Митро

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) или обычной команды для этого. Это также не требует прав суперпользователя.

Если 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, когда включена цифровая блокировка.

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


Это очень хорошо, выводом является нажатие клавиши n1 нажатие клавиши n2 отпускание .. Есть ли способ показать букву вместо числа? А как хранить в файле свой «журнал»? PS: к сожалению, на моем компьютере эта программа не установлена ​​по умолчанию, и в данный момент я ничего не могу установить, я пробовал на другом компьютере.
Митро

Кроме того, номер не может распознать, если я использую 2 или "
Митро

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находится в эталонной реализации X как минимум с 1987 года. О какой системе мы говорим здесь? Может быть, xmodmapэто не в вашем $PATH( /usr/dt/binили другом?).
Стефан Шазелас

3

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


Это не то, что я ищу. Я прочитал по ссылке, но это только для терминальной сессии.
Митро
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.