Мне нужно записывать каждое нажатие клавиши имагазинв файле в каталоге пользователя ~, при использовании моей учетной записи я не являюсь sudoer и не могу устанавливать программы (типаlogKeys) любым способом. Как я могу это сделать с помощью терминала?
ПРИМЕЧАНИЕ:Этот вопрос не является дубликатом другого упомянутого вопроса; в этом вопросе я спрашиваю о каждом нажатии клавиши, тогда как в другом вопросе спрашивающий спрашивал о нажатии клавиши в терминальном сеансе.
решение1
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
) в символ клавиши с помощью xmodmap -pke
again, а effective
модификатор bitmask во что-то более полезное с помощью 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
туда команду из совместимой системы и выполнить ее.
решение2
Рассматривали ли вы возможность использованияscript
команда?