Использование клавиатуры в JInput без прав root - PullRequest
1 голос
/ 29 ноября 2010

Я пишу программу, которая должна опрашивать клавиши клавиатуры в определенное время, и вместо того, чтобы писать свой собственный класс опроса клавиатуры, управляемый событиями, я решил использовать встроенный класс клавиатуры JInput.

Он отлично работает, когда я запускаю свою программу от имени пользователя root (я использую Ubuntu 10.10), но он даже не обнаруживает тот факт, что клавиатура существует, когда она запускается как обычный пользователь.Я получаю следующее сообщение об ошибке:

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)

У кого-нибудь есть опыт использования клавиатур в JInput или какие-либо идеи о том, как обойти это, чтобы мне не нужно было работать от имени пользователя root?Спасибо!

1 Ответ

1 голос
/ 29 ноября 2010

Вместо запуска программы от имени пользователя root вы также можете выполнить

sudo chmod a+r /dev/input/event5

(или какое бы устройство ни указывало на вашу клавиатуру). Однако вам решать, какой из них более безопасен для ваших целей.Я думаю, но не уверен, что разрешения будут восстановлены после перезапуска.

Мне так и не удалось заставить работать адаптер клавиатуры JInput в Ubuntu, не запустив приложение от имени пользователя root и не выполнив вышеуказанное.Возможно, это не тот ответ, который вам нужен, но он по крайней мере скажет вам, что вы не одиноки.

Очевидная причина, по которой устройство не может быть прочитано кем-либо, заключается в том, что непривилегированная программа (то есть кейлоггер)) не может просто прослушать весь ввод с клавиатуры в любой момент времени.Я думаю, что различные оконные системы работают в привилегированном режиме и затем контролируют доступ к данным клавиатуры для пользовательских программ.Если бы JInput прошел через этот слой, вам, вероятно, не потребовались бы специальные привилегии.

Редактировать

Поскольку это, казалось, работает для OP, я включу примечание barti_ddu здесь,В качестве альтернативы ручному изменению разрешений на устройстве клавиатуры, как я уже отмечал выше, вы также можете установить правило udev, чтобы эти разрешения устанавливались автоматически.Примечательно, что вы можете использовать его, чтобы установить группу для устройства (скажем, «input»), а затем запустить программу соответствующим образом.

Для этого потребуется добавить что-то вроде этого в /etc/udev/rules.d/99-evdev.rules:

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

Предупреждение: не проверено.

...