记录每个按键并将其存储在文件中


31

我需要记录每个击键并将其存储在用户目录〜中的文件中,使用我的帐户时,我不会感到无所顾忌,也无法以任何方式安装程序(例如logKeys)。我该如何使用终端机?

注意:此问题不是其他提及问题的重复;在这个问题中,我询问的是每个击键,而在另一个问题中,提问者询问的是终端会话中的击键。


您是指来自给定终端设备的任何按键字符/字节,还是什至来自连接到主机的任何键盘的任何按键/释放键?
斯特凡Chazelas

每个连接kryboard
Mitro

2
@etherfish不是重复的,因为,我的意思不是仅在终端会话中,而是在没有程序运行时在台式机中的每个按键。
Mitro

1
在GUI(X11)会话中?还是在Linux控制台上?终端与此无关,因为您不希望只记录您在终端中输入的内容?
吉尔斯(Gilles)'“ SO-不要邪恶”

1
@AlessioMTX您是正确的。我的错。
etherfish

Answers:


47

xinput test可以将所有键盘事件报告给X服务器。在GNU系统上:

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

如果要从密钥代码中获取密钥名称,则可以使用以下命令对该输出进行后处理:

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

添加> file.log以存储在日志文件中。或| tee file.log同时登录并查看它。

xinput查询X服务器的XinputExtension。这与您将要达到的标准(我不知道涵盖X实用程序的任何标准)或执行此操作的通用命令一样接近。这也不需要root特权。

如果X服务器和xinput支持XinputExtension的版本2,则可以使用test-xi2代替test它来提供更多信息,尤其是修饰符的状态(shift,ctrl,alt ...)。例:

$ 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

您可以再次detail通过的帮助将()中的键代码转换为一个keyym,在的帮助下xmodmap -pkeeffective修饰符位掩码转换为更有用的内容xmodmap -pm。例如:

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]"
    }
  }'

将输出:

KeyPress 24 [q] 0x19 [Shift,Alt,Num_Lock]

当启用num-lock时按Shift + Alt + q时。

请注意,您无需具有超级用户权限即可安装程序。如果您对文件系统上授予执行权限的某处(您的主目录/tmp/var/tmp...)具有写访问权,则可以xinput从那里的兼容系统复制命令并执行它。


很好,输出是按n1键和按n2键释放..有没有办法显示数字的字母instad?以及如何在文件中存储“日志”?PS:很遗憾,我的PC默认没有安装此程序,并且在其他PC上尝试过此操作,目前无法安装任何程序。
Mitro

此外,该数字无法识别我是否使用2或“
Mitro

2
@AlessioMTX,尽管包括Shift和Capslock在内,所有按键都将被记录。另请参阅我的编辑,以获取键标签/符号而不是键代码。
斯特凡Chazelas

1
@AlessioMTX,您需要xinput 1.6.1或更高版本--root。可以从xorg.freedesktop.org/releases/individual/app单独下载X实用程序。如果您不想从源代码进行编译。Debian的xinput 1.6.1适用于Linux或kfreebsd的几种架构。
斯特凡Chazelas

1
@AlessioMTX,用于X服务器的事件。xmodmap至少从1987年开始就已经在参考X实现中使用了。我们在这里谈论什么系统?可能xmodmap不是您$PATH/usr/dt/bin或其他?)中的人。
斯特凡Chazelas

3

您是否考虑过使用该script命令?


这不是我想要的。我从链接中读取,但仅用于终端会话。
Mitro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.