【问题标题】:Using Keyboards in JInput without root privileges在没有 root 权限的情况下在 JInput 中使用键盘
【发布时间】:2010-11-29 19:13:22
【问题描述】:

我正在编写一个需要在特定时间轮询键盘键的程序,而不是通过编写自己的事件驱动的键盘轮询类,我想我会使用 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 身份运行?谢谢!

【问题讨论】:

    标签: java keyboard jinput


    【解决方案1】:

    除了以root身份运行程序,您还可以这样做

    sudo chmod a+r /dev/input/event5
    

    (或指向您键盘的任何设备)不过,您可以自行决定哪种设备更安全。我认为,但不确定,重启后权限会恢复。

    如果不以 root 身份运行应用程序或执行上述操作,我永远无法让 JInput 的键盘适配器在 Ubuntu 中工作。可能不是您想要的答案,但它至少会告诉您您并不孤单。

    任何人都无法读取设备的明显原因是,非特权程序(即键盘记录器)无法在任何给定时间仅监听来自键盘的所有输入。我认为各种窗口系统以特权模式运行,然后控制用户程序对键盘数据的访问。如果 JInput 通过该层,您可能不需要特殊权限。

    编辑

    由于它似乎适用于 OP,我将在此处包含 barti_ddu 的注释。作为我上面提到的手动更改键盘设备权限的替代方法,您还可以设置 udev 规则,以便自动设置这些权限。值得注意的是,您可以使用它为设备设置组(例如“输入”),然后相应地运行程序。

    这将涉及向/etc/udev/rules.d/99-evdev.rules 添加类似这样的内容:

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

    警告:未经测试。

    【讨论】:

    • 简单的 udev 规则将保持 /dev/input/event* 权限。我宁愿创建特殊组(例如“输入”),然后将 KERNEL=="event*", NAME="input/%k", MODE="640", GROUP="input" 之类的内容放入 /etc/udev/rules.d/99-evdev.rules
    • @barti:啊,我的意思是权限恢复是一件好事:-)。但是在一个组中对设备进行沙箱化的想法是一个很好的想法。不幸的是,对于只想玩游戏的人来说,似乎所有这些解决方案都有些恶心(我会警惕安装一些说它需要在程序运行时不受限制地访问我的键盘设备的东西,无论它是否是是否在前台)。
    • @Mark:好的,我现在明白你的意思了(我很高兴,我已经引起了你的评论,无论如何):) 一切都归结为应用程序类型:我看不出任何理由为什么游戏应该可以访问系统范围的键盘事件。另一方面,调整输入访问权限看起来不像设置 setuid 位或以超级用户身份运行程序那么邪恶。但同样,我可能会遗漏一些东西:)
    • @bart_ddu:不,我完全同意。但我认为两者都没有必要。我不太了解设备输入是如何通过各个层过滤的。我预计问题是它不支持基于轮询的架构。或者问题可能在于需要窗口焦点;我不知道。顺便说一句,有一个键盘控制器使用 AWT 而不是本机设备,但我认为有一些障碍可以跳过。
    • 就是这样。谢谢!这是一个只有我会使用的程序(它是机器人直升机的控制器),所以 udev 规则胜出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2011-05-16
    • 2013-07-15
    • 2015-11-12
    • 2011-10-23
    相关资源
    最近更新 更多