すべてのキーストロークを記録し、ファイルに保存します


31

すべてのキーストロークを記録し、ユーザーディレクトリのファイルに保存する必要があります。アカウントを使用する場合、私はsudoerではなく、プログラム(logKeysなど)をインストールできません。ターミナルを使用してどのようにできますか?

注:この質問は、他の言及の質問の複製ではありません。この質問では、すべてのキーストロークについて質問していますが、質問者はターミナルセッションでキーストロークについて質問しました。


特定の端末デバイスからのキー文字/バイト、またはホストコンピューターに接続されたキーボードからのキーの押下/解放を意味しますか?
ステファンシャゼル

すべての接続kryboard
Mitro

2
@etherfish複製ではありません。なぜなら、ターミナルセッションだけでなく、プログラムも実行されていないデスクトップでも、すべてのキーストロークを意味するからです。
Mitro

1
GUI(X11)セッションで?または、Linuxコンソールで?ターミナルは、ターミナルで入力したものの記録だけが必要なわけではないので、これと何の関係があるのですか?
ジル 'SO-悪であるのをやめる'

1
@AlessioMTXあなたは正しいです。私の間違い。
エーテルフィッシュ

回答:


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、ログに記録して確認することもできます。

xinputXサーバーのXinputExtensionを照会します。これは、標準(Xユーティリティをカバーする標準を認識していません)またはそれを行うための一般的なコマンドとして取得しようとしているものに近いものです。また、ルート権限も必要ありません。

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)をキーシムに変換するには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]"
    }
  }'

出力されます:

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キーを含むすべてのキー入力が記録されます。キーコードの代わりにキーラベル/シンボルの編集も参照してください。
ステファンシャゼル

1
@AlessioMTX、が必要xinput 1.6.1またはそれ以降の--root。Xユーティリティは、xorg.freedesktop.org/releases/individual/appから個別にダウンロードできます。ソースからコンパイルしたくない場合。Debianには、Linuxまたはkfreebsdのいくつかのアーキテクチャ用のxinput 1.6.1があります。
ステファンシャゼル

1
@ AlessioMTX、Xサーバーへのイベントを意味します。xmodmap少なくとも1987年以来、リファレンスXの実装に含まれています。ここで話しているシステムは何ですか?それがいる可能性がありxmodmap、あなたではありません$PATH/usr/dt/binまたは他の?)。
ステファンシャゼル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.