Necesito registrar cada pulsación de tecla y almacenar en un archivo en el directorio de usuario ~, cuando uso mi cuenta, no soy sudoer y no puedo instalar programas (como logKeys) de ninguna manera. ¿Cómo podría hacerlo usando la terminal?
Respuesta aceptada:
xinput test
puede informar todos los eventos del teclado al servidor X. En un sistema GNU:
xinput list |
grep -Po 'id=Kd+(?=.*slaves*keyboard)' |
xargs -P0 -n1 xinput test
Si desea obtener los nombres de las claves a partir de los códigos de las claves, puede posprocesar esa salida con:
awk 'BEGIN{while (("xmodmap -pke" | getline) > 0) k[$2]=$4}
{print $0 "[" k[$NF] "]"}'
Agregar > file.log
para almacenar en un archivo de registro. O | tee file.log
tanto para iniciar sesión como para verlo.
xinput
consulta la XinputExtension del servidor X. Eso es lo más cercano que obtendrá como estándar (no conozco ningún estándar que cubra las utilidades X) o un comando común para hacerlo. Eso tampoco requiere privilegios de root.
Si el servidor X y xinput admiten la versión 2 de XinputExtension, puede usar test-xi2
en lugar de test
que da más información, en particular el estado de los modificadores (shift, ctrl, alt…). Ejemplo:
$ 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
Puede traducir el código clave (en detail
) a un keysym con la ayuda de xmodmap -pke
de nuevo, y el effective
modificador máscara de bits a algo más útil con la ayuda de xmodmap -pm
. Por ejemplo:
xinput test-xi2 --root | perl -lne '
BEGIN{$"=",";
open X, "-|", "xmodmap -pke";
while (<X>) {$k{$1}=$2 if /^keycodes+(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]"
}
}'
generaría:
KeyPress 24 [q] 0x19 [Shift,Alt,Num_Lock]
cuando presiono Shift+Alt+q cuando el bloqueo numérico está activado.
Tenga en cuenta que no necesita tener privilegios de superusuario para instalar un programa. Si tiene acceso de escritura a algún lugar del sistema de archivos donde se otorga el permiso de ejecución (su directorio de inicio, /tmp
, /var/tmp
…) entonces puedes copiar un xinput
comando desde un sistema compatible allí y ejecútelo.