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


31

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

참고 : 이 질문은 다른 언급 질문과 중복되지 않습니다. 이 질문에서 나는 모든 키 입력에 대해 묻고 있지만 다른 질문에서는 터미널 세션에서 키 입력에 대해 물었습니다.


주어진 터미널 장치에서 오는 키 문자 / 바이트 또는 호스트 컴퓨터에 연결된 키보드에서도 키 누름 / 해제를 의미합니까?
Stéphane Chazelas

연결된 모든 크리 보드
Mitro

2
@etherfish 그것은 중복되지 않습니다. 왜냐하면 터미널 세션뿐만 아니라 프로그램이 실행되지 않을 때 데스크톱에서도 모든 키 입력을 의미하기 때문입니다.
Mitro

1
GUI (X11) 세션에서? 아니면 리눅스 콘솔에서? 터미널에 입력 한 내용에 대한 기록 만 원하지 않기 때문에 터미널은 이와 관련이 있습니까?
Gilles 'SO- 악마 그만해'

1
@AlessioMTX 맞습니다. 내 실수.
etherfish

답변:


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

키 코드 (in detail)를 xmodmap -pke다시 사용하여 keysym로 변환하고 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 키 릴리스입니다. 숫자의 문자를 표시하는 방법이 있습니까? 그리고 파일에 "로그"를 저장하는 방법? 추신 : 불행히도 내 PC에는 기본적 으로이 프로그램이 설치되어 있지 않으며 현재 아무것도 설치할 수 없으며 다른 PC에서 시도했습니다.
Mitro

또한 2 또는 "
Mitro

2
@AlessioMTX에서는 Shift 및 Capslock을 포함하여 모든 키 누름이 기록됩니다. 키 코드 대신 키 레이블 / 기호에 대한 편집 내용도 참조하십시오.
Stéphane Chazelas

1
@AlessioMTX,에 xinput 1.6.1대한 최신 정보 가 필요 합니다 --root. X 유틸리티는 xorg.freedesktop.org/releases/individual/app 에서 개별적으로 다운로드 할 수 있습니다 . 소스에서 컴파일하지 않으려는 경우. 데비안은 리눅스 나 kfreebsd를위한 여러 아키텍처를위한 xinput 1.6.1 을 가지고 있습니다.
Stéphane Chazelas 12

1
@AlessioMTX, 그것은 X 서버에 대한 이벤트를 의미합니다. xmodmap적어도 1987 년부터 참조 X 구현에있었습니다. 우리는 여기서 어떤 시스템을 이야기하고 있습니까? 그것이 xmodmap당신의 $PATH( /usr/dt/bin또는 다른?)에 있지 않을 수 있습니까?
Stéphane Chazelas

3

script명령 사용을 고려 했습니까 ?


내가 찾고있는 것이 아닙니다. 링크에서 읽었지만 터미널 세션 전용입니다.
Mitro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.