모든 키 입력을 기록하고 파일에 저장

모든 키 입력을 기록하고 파일에 저장

모든 키 입력을 기록해야 하고가게사용자 디렉토리의 파일에 ~, 내 계정을 사용할 때 sudoer가 아니고 프로그램을 설치할 수 없습니다(예:로그키) 어떠한 방식으로. 터미널을 사용하여 어떻게 그렇게 할 수 있습니까?

메모:이 질문은 다른 언급 질문과 중복되지 않습니다. 이 질문에서는 모든 키 입력에 대해 묻는 반면, 다른 질문에서는 질문자가 터미널 세션의 키 입력에 대해 질문했습니다.

답변1

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

detailagain 의 도움으로 키코드(in)를 키심으로 변환할 수 있고 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

답변2

다음을 사용하는 것을 고려해 보셨나요?script명령?

관련 정보