Grave cada pressionamento de tecla e armazene em um arquivo

Grave cada pressionamento de tecla e armazene em um arquivo

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 testpode 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.logpara armazenar em um arquivo de log. Ou | tee file.logpara registrar e ver.

xinputconsulta 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-xi2em vez de testqual 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 -pkenovamente, e o effectivemodificador 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 xinputcomando de um sistema compatível e executá-lo.

Responder2

Você já pensou em usar oscriptcomando?

informação relacionada