linux/input.h
-
Hallo,
ich versuche gerade sowas wie einen Keylogger in Linux hinzukriegen, komm aber nicht weiter. Wenn ich folgenden Code ausführe, steht im event.code immer nur ein einziger Zahlenwert und read() returnt sofort. Wenn ich jedoch auf eine Taste drücke, wird nicht wie erwartet ein neuer Zahlenwert ausgegeben, sondern immer noch der alte. Ist "/dev/input/event0" hier vielleicht der Fehler? Welches Device muss ich da genau angeben?
#include <linux/input.h> #include <fcntl.h> #include <unistd.h> #include <iostream> int main(){ int fd = open("/dev/input/event0", O_RDONLY); struct input_event event; while(true){ read(fd, &event, sizeof(event)); std::cout << event.code << '\n'; } }
-
lrwxrwxrwx 1 root root 9 Jun 8 14:13 usb-Logitech_USB_Keyboard-event-if01 -> ../event3 lrwxrwxrwx 1 root root 9 Jun 8 14:13 usb-Logitech_USB_Keyboard-event-kbd -> ../event2 lrwxrwxrwx 1 root root 9 Jun 8 14:13 usb-Logitech_USB_Optical_Mouse-event-mouse -> ../event1 lrwxrwxrwx 1 root root 9 Jun 8 14:13 usb-Logitech_USB_Optical_Mouse-mouse -> ../mouse0
Ich hab auch schon event3 und event2 ausprobiert, mit dem gleichen Ergebnis. Also irgendwas muss doch noch fehlen?
-
Eingebender schrieb:
Wenn ich jedoch auf eine Taste drücke, wird nicht wie erwartet ein neuer Zahlenwert ausgegeben, sondern immer noch der alte. Ist "/dev/input/event0" hier vielleicht der Fehler? Welches Device muss ich da genau angeben?
$ fgrep 'event' /var/log/Xorg.0.log | grep 'Keyboard'
?
Mit dem Format, das Linux da verwendet, kenne ich mich nicht aus, aber der von dir geschriebene Code funzt bei mir, wenn ich das korrekte Device angebe (event10).
-
Nundenn, ich hab von event0 bis hin zu event10 und /dev/stdin alles ausprobiert, klappt nicht. Ich bekomme immer wieder ununterbrochen den selben, nach jedem Programmstart zufällig neuen Zahlenwert zurückgeliefert. Kann es sein, dass es eine andere Datei ist, nach der ich suche?
-
/var/log/Xorg.0.log
existiert nicht auf meiner Platte
-
Es kann sein, dass der Kernel dich die Ereignisse nicht lesen lässt, weil dein gegenwärtiger Nutzer nicht die nötigen Rechte hat. In der /etc/group kannst du das nachsehen:
$ fgrep 'input' /etc/group
Die Devices sollten alle
input
gehören:$ ls -g /dev/input/event* crw-rw---- 1 input 13, 64 8. Jun 2016 /dev/input/event0 crw-rw---- 1 input 13, 65 8. Jun 2016 /dev/input/event1 crw-rw---- 1 input 13, 74 8. Jun 2016 /dev/input/event10 ...
Alternativ kannst du versuchen, dein Programm mal als root laufenzulassen und zu schauen, ob's so immer noch nicht geht.
EDIT: Ich habe mich in ein bisschen in das Benamungsschema der /dev/input/by-id/-Dateien eingelesen. Wenn deine Maschine und meine Maschine so ungefähr gleich funktionieren, dann sollte dein event-File
event2
sein. Allerdings garantiere ich dafür nicht.EDIT: Habe gerade mal einen Neustart gemacht, die Enumerierung ist jetzt eine andere. Sprich, wenn dein Programm eine bestimmte Hardware loggen soll, nimm besser die Dateien unter /dev/input/by-id/, die verlinken dann auf das korrekte Device.
-
Mit Root-Rechten klappt es jetzt danke.
Ich hätte strerror() aufrufen sollen, weiß ich jetzt fürs nächstes Mal.