Grave cada pressionamento de tecla e armazene em um arquivo

31

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 forma alguma. 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, estou perguntando sobre cada pressionamento de tecla, enquanto no outro o solicitante pergunta sobre o pressionamento de tecla na sessão do terminal.

Mitro
fonte
Você quer dizer algum caractere / byte de tecla proveniente de um determinado dispositivo terminal ou pressionar / soltar uma tecla, mesmo de qualquer teclado conectado ao computador host?
Stéphane Chazelas
Todo kryboard conectado
Mitro
2
@etherfish não é uma duplicata porque, não quero dizer apenas na sessão do terminal, mas todas as teclas, também na área de trabalho, quando nenhum programa está em execução.
Mitro 13/05
1
Em uma sessão da GUI (X11)? Ou em um console Linux? O que um terminal tem a ver com isso, já que você não deseja apenas um registro do que digitou em um terminal?
Gilles 'SO- stop be evil'
1
@AlessioMTX Você está correto. Meu erro.
Etherfish 14/05

Respostas:

47

xinput testpode 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ê deseja obter os nomes das chaves, poderá pós-processar essa saída com:

awk 'BEGIN{while (("xmodmap -pke" | getline) > 0) k[$2]=$4}
     {print $0 "[" k[$NF] "]"}'

Adicionar > file.logpara armazenar em um arquivo de log. Ou | tee file.logpara logar e vê-lo.

xinputconsulta o XinputExtension do servidor X. Isso é o mais próximo que você vai conseguir de um padrão (não conheço nenhum padrão que cubra os utilitários X) ou um 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, em test-xi2vez disso test, para obter 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) em um chaveiro 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 para instalar um programa. Se você tiver acesso de gravação para algum lugar no sistema de arquivos onde executar permissão é concedida (seu diretório home, /tmp, /var/tmp...), então você pode copiar um xinputcomando a partir de um sistema compatível lá e executá-lo.

Stéphane Chazelas
fonte
É muito bom, a saída é pressionar a tecla n1 pressionar a tecla n2 liberação da tecla. Existe uma maneira de mostrar a letra instad do número? E como armazenar em um arquivo o "log"? PS: infelizmente, meu PC não possui esse programa instalado por padrão, e não consigo instalar nada no momento, tentei em outro PC.
Mitro
Além disso, o número não pode reconhecer se estou usando 2 ou "
Mitro 13/05
2
@AlessioMTX, todas as teclas pressionadas serão registradas, incluindo as teclas Shift e Capslock. Veja também minha edição para etiquetas / símbolos de chave em vez de códigos de chave.
Stéphane Chazelas
1
@AlessioMTX, você precisará xinput 1.6.1ou mais novo para --root. Os utilitários X podem ser baixados individualmente em xorg.freedesktop.org/releases/individual/app . Se você não deseja compilar a partir da fonte. O Debian possui um xinput 1.6.1 para várias arquiteturas para Linux ou kfreebsd.
Stéphane Chazelas
1
@AlessioMTX, destinado a eventos no servidor X. xmodmapestá na implementação de referência X desde 1987, pelo menos. De que sistema estamos falando aqui? Será que xmodmapnão está no seu $PATH( /usr/dt/binou outro?).
Stéphane Chazelas
3

Você já pensou em usar o scriptcomando?

etherfish
fonte
Não é o que estou procurando. Eu li no link, mas é apenas para uma sessão de terminal.
Mitro