Grave todos os pressionamentos de tecla e armazene em um arquivo

28

Eu preciso gravar cada pressionamento de tecla e armazenar em um arquivo no diretório do usuário ~, ao usar minha conta, não sou sudoer e não consigo instalar programas (como logKeys ) de qualquer forma. Como eu poderia fazer isso usando o terminal?

NOTA: Esta questão não é uma duplicata da outra questão de menção; nesta pergunta eu estou perguntando sobre cada batida de tecla, enquanto no outro o interlocutor perguntou sobre batida de tecla na sessão de terminal.

    
por Mitro 13.05.2014 / 09:55

2 respostas

41

xinput test pode relatar todos os eventos do teclado para o servidor X. Em um sistema GNU:

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

Se você quiser obter os nomes das chaves dos códigos-chave, poderá 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 logar e ver.

xinput consulta o XinputExtension do servidor X. Isso é o mais próximo que você vai obter como padrão (não estou ciente de nenhum padrão que cubra os utilitários X) ou comando comum para fazer isso. Isso também não requer privilégios de root.

Se o servidor X e o xinput suportarem a versão 2 do XinputExtension, você poderá usar test-xi2 em vez de test , o que dá 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 keycode (em detail ) para um keysym com a ajuda de xmodmap -pke novamente, e a máscara de bit do modificador effective 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.

Note que você não precisa ter privilégios de superusuário para instalar um programa. Se você tiver acesso de gravação em algum lugar no sistema de arquivos no qual a permissão de execução é concedida (seu diretório base, /tmp , /var/tmp ...), você poderá copiar um comando xinput de um sistema compatível e executá-lo.

    
por 13.05.2014 / 11:25
4

Você já pensou em usar o comando script ?

    
por 13.05.2014 / 10:13