记录每次击键并存储在文件中

Mit*_*tro 34 logs keyboard input x11

我需要记录每个击键并存储在用户目录中的文件中~,使用我的帐户时,我不是 sudoer 并且我无法以任何方式安装程序(如logKeys)。我怎么能用终端这样做?

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

Sté*_*las 53

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

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

如果您想从键码中获取键名,您可以使用以下命令对该输出进行后处理:

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

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

xinput查询 X 服务器的 XinputExtension。这与您将要获得的标准(我不知道任何涵盖 X 实用程序的标准)或通用命令一样接近。这也不需要root权限。

如果 X 服务器和 xinput 支持 XinputExtension 的第 2 版,您可以使用whichtest-xi2代替testwhich 提供更多信息,特别是修饰符的状态(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
Run Code Online (Sandbox Code Playgroud)

您可以在键码(在翻译detail)用的帮助键符xmodmap -pke又和effective修改位掩码的东西的帮助下更有帮助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]"
    }
  }'
Run Code Online (Sandbox Code Playgroud)

会输出:

KeyPress 24 [q] 0x19 [Shift,Alt,Num_Lock]
Run Code Online (Sandbox Code Playgroud)

当我在 num-lock 开启时按 Shift+Alt+q。

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

  • @AlessioMTX,所有按键操作都会被记录下来,包括 Shift 和 Capslock 按键。另请参阅我对键标签/符号而不是键码的编辑。 (2认同)