บันทึกการกดแป้นทุกครั้งและเก็บไว้ในไฟล์


31

ฉันต้องบันทึกทุกการกดแป้นและเก็บไว้ในไฟล์ในไดเรกทอรีผู้ใช้ ~ เมื่อใช้บัญชีของฉันฉันไม่ใช่ sudoer และฉันไม่สามารถติดตั้งโปรแกรม (เช่นlogKeys ) ในทางใดทางหนึ่ง ฉันจะใช้เทอร์มินัลได้อย่างไร

หมายเหตุ:คำถามนี้ไม่ใช่คำถามที่กล่าวถึงอื่น ๆ ในคำถามนี้ฉันถามเกี่ยวกับการกดแป้นทุกครั้งในขณะที่ผู้ถามอีกคนถามเกี่ยวกับการกดแป้นในเซสชันเทอร์มินัล


คุณหมายถึงอักขระ / ไบต์ที่สำคัญใด ๆ ที่มาจากอุปกรณ์เทอร์มินัลที่กำหนดหรือการกด / ปล่อยปุ่มใด ๆ แม้จากแป้นพิมพ์ใด ๆ ที่เชื่อมต่อกับโฮสต์คอมพิวเตอร์
Stéphane Chazelas

kryboard ที่เชื่อมต่อกันทุกเครื่อง
Mitro

2
@etherfish มันไม่ได้ซ้ำกันเพราะฉันไม่ได้หมายถึงเฉพาะในเทอร์มินัลเซสชั่น แต่ทุกการกดแป้นพิมพ์ยังอยู่ในเดสก์ท็อปเมื่อไม่มีโปรแกรมทำงาน
Mitro

1
ในเซสชัน GUI (X11) หรือไม่ หรือบนคอนโซล Linux? เทอร์มินัลต้องทำอะไรกับสิ่งนี้เนื่องจากคุณไม่ต้องการเพียงบันทึกสิ่งที่คุณพิมพ์ในเทอร์มินัล
Gilles 'หยุดชั่วร้าย'

1
@AlessioMTX คุณถูกต้อง ความผิดพลาดของฉัน.
etherfish

คำตอบ:


47

xinput testสามารถรายงานเหตุการณ์แป้นพิมพ์ทั้งหมดไปยังเซิร์ฟเวอร์ X ในระบบ GNU:

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

หากคุณต้องการรับชื่อคีย์จากรหัสคีย์คุณสามารถ post-process ที่เอาต์พุตด้วย:

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

เพิ่ม> file.logไปเก็บในไฟล์บันทึก หรือ| tee file.logเพื่อบันทึกและดู

xinputเคียวรี XinputExtension ของเซิร์ฟเวอร์ X นั่นใกล้เคียงกับที่คุณจะได้รับเป็นมาตรฐาน (ฉันไม่ทราบมาตรฐานใด ๆ ที่ครอบคลุมยูทิลิตี้ X) หรือคำสั่งทั่วไปในการทำเช่นนั้น ซึ่งไม่ต้องการสิทธิ์รูท

หากเซิร์ฟเวอร์ X และ xinput รองรับรุ่น 2 ของ XinputExtension คุณสามารถใช้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

คุณสามารถแปล keycode (ในdetail) เพื่อ keysym ด้วยความช่วยเหลือของที่xmodmap -pkeอีกครั้งและeffectivebitmask 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]

เมื่อฉันกด Shift + Alt + q เมื่อ num-lock เปิดอยู่

โปรดทราบว่าคุณไม่จำเป็นต้องมีสิทธิ์พิเศษสำหรับผู้ใช้ในการติดตั้งโปรแกรม หากคุณมีสิทธิ์เขียนเพื่อเข้าถึงบางส่วนในระบบไฟล์ที่ได้รับอนุญาตให้ดำเนินการ (โฮมไดเร็กตอรี่ของคุณ/tmp, /var/tmp... ) จากนั้นคุณสามารถคัดลอกxinputคำสั่งจากระบบที่เข้ากันได้ที่นั่นและดำเนินการนั้น


มันดีมากเอาท์พุทคือการกดปุ่มกดปุ่ม n1 กดปุ่มปล่อย n2 .. มีวิธีแสดงตัวอักษรของตัวเลขหรือไม่? และวิธีการจัดเก็บในไฟล์ "บันทึก"? PS: น่าเสียดายที่พีซีของฉันไม่ได้ติดตั้งโปรแกรมนี้ตามค่าเริ่มต้นและฉันไม่สามารถติดตั้งอะไรได้ในขณะนี้ฉันลองบนพีซีเครื่องอื่น
Mitro

ยิ่งกว่านั้นจำนวนที่ไม่สามารถจดจำได้ถ้าฉันใช้ 2 หรือ "
Mitro

2
@AlessioMTX การกดปุ่มทั้งหมดจะถูกบันทึกไว้รวมถึง Shift และ Capslock ดูการแก้ไขของฉันสำหรับป้ายชื่อ / สัญลักษณ์แทนรหัส
Stéphane Chazelas

1
@AlessioMTX คุณจะต้องหรือใหม่กว่าสำหรับxinput 1.6.1 --rootสาธารณูปโภค X สามารถดาวน์โหลดได้เป็นรายบุคคลจากxorg.freedesktop.org/releases/individual/app หากคุณไม่ต้องการรวบรวมจากแหล่งที่มา Debian มีxinput 1.6.1สำหรับหลาย ๆ สถาปัตยกรรมสำหรับ Linux หรือ kfreebsd
Stéphane Chazelas

1
@AlessioMTX นั่นมีไว้สำหรับเหตุการณ์ไปยังเซิร์ฟเวอร์ X xmodmapได้รับการอ้างอิงในการใช้งาน X ตั้งแต่ปี 1987 เป็นอย่างน้อย เรากำลังพูดถึงระบบอะไรที่นี่? เป็นไปได้ไหมที่xmodmapไม่ได้อยู่ในของคุณ$PATH( /usr/dt/binหรืออื่น ๆ )
Stéphane Chazelas

3

คุณได้พิจารณาใช้scriptคำสั่งหรือไม่?


ไม่ใช่สิ่งที่ฉันกำลังมองหา ฉันอ่านจากลิงค์ แต่สำหรับเทอร์มินัลเซสชันเท่านั้น
Mitro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.