2010-11-29 5 views
1

Ich schreibe ein Programm, das zu bestimmten Zeiten Tastaturschlüssel abfragen muss, und anstatt zu versuchen, meine eigene ereignisgesteuerte Tastaturabfrageklasse zu schreiben, dachte ich, ich würde es benutzen JInputs integrierte Tastaturklasse.Verwenden von Tastaturen in JInput ohne root-Berechtigungen

Es funktioniert perfekt, wenn ich mein Programm als root ausführen (ich bin auf Ubuntu 10.10 ausgeführt), aber es erkennt nicht einmal die Tatsache, dass die Tastatur existiert, wenn sie als normaler Benutzer ausgeführt wird. Ich erhalte die folgende Fehlerausgang:

Nov 29, 2010 2:08:50 PM net.java.games.input.DefaultControllerEnvironment getControllers 
INFO: Loading: net.java.games.input.LinuxEnvironmentPlugin 
Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event11): Failed to open device /dev/input/event11 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event10): Failed to open device /dev/input/event10 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event9): Failed to open device /dev/input/event9 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event8): Failed to open device /dev/input/event8 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event7): Failed to open device /dev/input/event7 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event6): Failed to open device /dev/input/event6 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event5): Failed to open device /dev/input/event5 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event4): Failed to open device /dev/input/event4 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event3): Failed to open device /dev/input/event3 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event2): Failed to open device /dev/input/event2 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event1): Failed to open device /dev/input/event1 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event0): Failed to open device /dev/input/event0 (13) 

Hat jemand keine Erfahrung mit Tastaturen in JInput oder irgendwelche Ideen, wie dies zu umgehen, so habe ich nicht als root ausführen? Vielen Dank!

Antwort

1

Statt das Programm als root laufen, können Sie auch

sudo chmod a+r /dev/input/event5 

(Oder je nachdem, was Gerät zeigt auf der Tastatur) Es liegt an Ihnen zu entscheiden, welche für Ihre Zwecke sicherer ist, wenn. Ich denke, bin mir aber nicht sicher, ob die Berechtigungen nach einem Neustart wiederhergestellt werden.

Ich war nie in der Lage, JInputs Tastaturadapter in Ubuntu zu arbeiten, ohne die Anwendung als root auszuführen oder das obige zu tun. Wahrscheinlich keine Antwort, die du haben wolltest, aber es wird dir wenigstens sagen, dass du nicht alleine bist.

Der offensichtliche Grund, warum das Gerät nicht von irgendjemandem gelesen werden kann, ist so, dass ein unprivilegiertes Programm (d. H. Keylogger) nicht nur alle von der Tastatur kommenden Eingaben jederzeit abhören kann. Ich denke, dass die verschiedenen Fenstersysteme in einem privilegierten Modus laufen und dann den Zugriff auf die Tastaturdaten für Benutzerprogramme steuern. Wenn JInput diese Ebene durchlaufen hat, benötigen Sie wahrscheinlich keine speziellen Berechtigungen.

bearbeiten

Da es für die OP schien zu funktionieren, werde ich barti_ddu Anmerkung hier enthalten. Als Alternative zum manuellen Ändern der Berechtigungen auf dem Tastaturgerät, wie oben erwähnt, können Sie auch eine udev-Regel festlegen, sodass diese Berechtigungen automatisch festgelegt werden. Man könnte sie auch verwenden, um die Gruppe für das Gerät festzulegen (sagen wir "Eingabe") und dann das Programm entsprechend auszuführen.

Es würde bedeuten, so etwas zu /etc/udev/rules.d/99-evdev.rules fügte hinzu:

KERNEL=="event*", NAME="input/%k", MODE="640", GROUP="input" 

Warnung: ungetestet.

+1

Einfache udev-Regel würde beibehalten/dev/input/event * -Berechtigungen. Ich würde lieber eine spezielle Gruppe (zB "input") erstellen und dann etwas wie "KERNEL ==" event * ", NAME =" input /% k ", MODE =" 640 ", GROUP =" input "' zu/etc/udev/rules.d/99-evdev.rules –

+0

@barti: Ahh, ich meinte die Berechtigungen als eine gute Sache rückgängig zu machen :-). Aber die Idee, die Geräte in einer Gruppe zu sandboxieren, ist gut. Leider scheint es, dass all diese Lösungen für jemanden, der nur das Spiel spielen will, ziemlich eklig sind (ich würde mich davor hüten, etwas zu installieren, das uneingeschränkten Zugriff auf mein Tastaturgerät während des laufenden Programms benötigt, egal ob es das ist oder nicht im Vordergrund oder nicht). –

+0

@Mark: Ok, ich sehe Deinen Punkt jetzt (und ich bin froh, dass ich Deinen Kommentar provoziert habe) :) Alles läuft auf den Anwendungstyp hinaus: Ich kann keinen Grund sehen, warum das Spiel Zugriff darauf haben sollte systemweite Tastaturereignisse. Auf der anderen Seite sieht das Tunen von Eingabezugriffsberechtigungen weniger böse aus als das Setzen von Setuidbit oder das Ausführen von Programmen als Superbenutzer. Aber wieder kann ich etwas verpassen :) –