Preciso registrar cada pressionamento de tecla elojaem um arquivo no diretório do usuário ~, ao usar minha conta, não sou sudoer e não consigo instalar programas (comologKeys) de qualquer forma. Como eu poderia fazer isso usando o terminal?
OBSERVAÇÃO:Esta questão não é uma duplicata da outra questão mencionada; nesta pergunta estou perguntando sobre cada pressionamento de tecla, enquanto na outra o autor da pergunta perguntou sobre o pressionamento de tecla na sessão do terminal.
Responder1
xinput test
pode reportar todos os eventos de teclado ao servidor X. Em um sistema GNU:
xinput list |
grep -Po 'id=\K\d+(?=.*slave\s*keyboard)' |
xargs -P0 -n1 xinput test
Se quiser obter nomes de chaves dos códigos de chave, você pode pós-processar essa saída com:
awk 'BEGIN{while (("xmodmap -pke" | getline) > 0) k[$2]=$4}
{print $0 "[" k[$NF] "]"}'
Adicione > file.log
para armazenar em um arquivo de log. Ou | tee file.log
para registrar e ver.
xinput
consulta o XinputExtension do servidor X. Isso é o mais próximo que você chegará de um padrão (não tenho conhecimento de nenhum padrão que cubra os utilitários X) ou de um comando comum para fazer isso. Isso também não requer privilégios de root.
Se o servidor X e o xinput suportam a versão 2 do XinputExtension, você pode usar test-xi2
em vez de test
qual fornece mais informações, em particular o estado dos modificadores (shift, ctrl, alt...). Exemplo:
$ 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
Você pode traduzir o código-chave (in detail
) para um símbolo de chave com a ajuda de xmodmap -pke
novamente, e o effective
modificador bitmask para algo mais útil com a ajuda de xmodmap -pm
. Por exemplo:
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]"
}
}'
produziria:
KeyPress 24 [q] 0x19 [Shift,Alt,Num_Lock]
quando pressiono Shift+Alt+q quando o num-lock está ativado.
Observe que você não precisa ter privilégios de superusuário parainstalarum programa. Se você tiver acesso de gravação em algum lugar no sistema de arquivos onde a permissão de execução é concedida (seu diretório inicial, /tmp
, /var/tmp
...), você poderá copiar um xinput
comando de um sistema compatível e executá-lo.
Responder2
Você já pensou em usar oscript
comando?