Rekam setiap penekanan tombol dan simpan dalam file

31

Saya perlu merekam setiap penekanan tombol dan menyimpan dalam file di direktori pengguna ~, ketika menggunakan akun saya, saya bukan sudoer dan saya tidak dapat menginstal program (seperti logKey ) dengan cara apa pun. Bagaimana saya bisa melakukannya dengan menggunakan terminal?

CATATAN: Pertanyaan ini bukan duplikat dari pertanyaan penyebutan lainnya; dalam pertanyaan ini saya bertanya tentang setiap keystroke, sementara di yang lain penanya bertanya tentang keystroke di sesi terminal.

Mitro
sumber
Apakah maksud Anda karakter kunci / byte yang berasal dari perangkat terminal yang diberikan, atau tombol tekan / lepaskan bahkan dari keyboard apa pun yang terhubung ke komputer host?
Stéphane Chazelas
Setiap papan ketik yang terhubung
Mitro
2
@etherfish itu bukan duplikat karena, saya tidak bermaksud hanya di sesi terminal, tetapi setiap keystroke, juga di desktop, ketika tidak ada program yang berjalan.
Mitro
1
Dalam sesi GUI (X11)? Atau di konsol Linux? Apa hubungannya terminal dengan ini, karena Anda tidak hanya menginginkan catatan tentang apa yang Anda ketikkan dalam terminal?
Gilles 'SANGAT berhenti menjadi jahat'
1
@AlessioMTX Anda benar. Kesalahanku.
etherfish

Jawaban:

47

xinput testdapat melaporkan semua acara keyboard ke server X. Pada sistem GNU:

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

Jika Anda ingin mendapatkan nama-nama kunci dari kode-kode kunci, Anda dapat memposting proses itu dengan:

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

Tambahkan > file.loguntuk menyimpan dalam file log. Atau | tee file.loguntuk kedua log dan melihatnya.

xinputmenanyakan XinputExtension dari server X. Itu sedekat yang Anda dapatkan sebagai standar (saya tidak mengetahui adanya standar yang mencakup utilitas X) atau perintah umum untuk melakukan itu. Itu juga tidak memerlukan hak root.

Jika X server dan xinput mendukung versi 2 dari XinputExtension, Anda dapat menggunakan test-xi2alih-alih testyang memberikan informasi lebih lanjut, khususnya keadaan pengubah (shift, ctrl, alt ...). Contoh:

$ 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

Anda dapat menerjemahkan kode kunci (dalam detail) ke keysym dengan bantuan xmodmap -pkelagi, dan effectivebitmask pengubah untuk sesuatu yang lebih bermanfaat dengan bantuan xmodmap -pm. Contohnya:

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

akan menghasilkan:

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

ketika saya menekan Shift + Alt + q ketika num-lock aktif.

Perhatikan bahwa Anda tidak perlu memiliki hak pengguna super untuk menginstal program. Jika Anda memiliki akses tulis ke suatu tempat di sistem file di mana mengeksekusi izin diberikan (direktori home Anda /tmp,, /var/tmp...) maka Anda dapat menyalin xinputperintah dari sistem yang kompatibel di sana dan menjalankannya.

Stéphane Chazelas
sumber
Sangat bagus, outputnya adalah tombol tekan tombol n1, tekan tombol n2, apakah ada cara untuk menampilkan huruf angka? Dan bagaimana cara menyimpan dalam file "log"? PS: Sayangnya PC saya tidak menginstal program ini secara default, dan saya tidak dapat menginstal apa pun saat ini, saya mencoba pada PC lain.
Mitro
Selain itu, nomornya tidak dapat dikenali jika saya menggunakan 2 atau "
Mitro
2
@AlessioMTX, semua penekanan tombol akan dicatat meskipun termasuk Shift dan Capslock. Lihat juga edit saya untuk label kunci / simbol bukan kode kunci.
Stéphane Chazelas
1
@AlessioMTX, Anda perlu xinput 1.6.1atau lebih baru untuk --root. Utilitas X dapat diunduh secara individual dari xorg.freedesktop.org/releases/individual/app . Jika Anda tidak ingin mengkompilasi dari sumber. Debian memiliki xinput 1.6.1 untuk beberapa arsitektur untuk Linux atau kfreebsd.
Stéphane Chazelas
1
@AlessioMTX, itu dimaksudkan untuk acara ke server X. xmodmaptelah di implementasi referensi X sejak 1987 setidaknya. Sistem apa yang kita bicarakan di sini? Mungkinkah itu xmodmaptidak ada di Anda $PATH( /usr/dt/binatau lainnya?).
Stéphane Chazelas
3

Sudahkah Anda mempertimbangkan untuk menggunakan scriptperintah?

etherfish
sumber
Bukan itu yang saya cari. Saya membaca dari tautan tetapi hanya untuk sesi terminal.
Mitro