为什么 /dev/input/eventX 权限会根据 X 服务器的启动方式而有所不同?

为什么 /dev/input/eventX 权限会根据 X 服务器的启动方式而有所不同?

我在 Debian 上用 C 编写了一个简单命令行二进制文件,它读取 /dev/input/eventX 上的 USB 游戏手柄输入并显示按下了哪些游戏手柄按钮。我通过打开和读取 /dev/input/eventX(无论哪个节点有游戏手柄)来做到这一点。在以下情况下,它无需 root 权限即可正常工作:

  • X 服务器由 lightdm 启动
  • 使用 ctrl+alt F1 使用本地 tty(不是 ssh)

问题是,如果我禁用 lightdm 并使用 xinit(使用默认 xterm)手动启动 X 服务器,则在使用 xterm 时,我没有权限访问 /dev/input/eventX 中的任何内容。当 lightdm 负责启动 X 或在本地使用基于文本的 tty 时,这不是问题。

我没有使用窗口管理器。

执行 ls -l 会显示游戏手柄设备的特殊 ACL 权限 (+)。那么,如果 tty 上的普通用户可以读取此设备,为什么 X 服务器下启动的 X 程序无法读取呢?在同一用户帐户下运行访问设备:

crw-rw----+  1 root input 13, 67 Jul 31 19:13 event3

这是为什么?为什么使用本地文本控制台 (即 ctrl+alt F1、F2 等) 与 xterm 的权限会有所不同?

答案1

ACL 条目在 tty 切换和登录/注销事件中动态添加/删除。

  • 如果您在 tty2 登录到控制台,您将获得设备权限。
  • 如果您按下 Alt+F3 并切换到无人(或另一个用户)登录的 tty3,您将失去设备权限,而 tty3 用户将获得这些权限。

这意味着 xinit 的使用方式需要稍微不同。

  • 如果您在 tty2 登录,在 tty7 上启动 X 服务器,并切换到 tty7 – 您将失去设备权限,因为从技术上讲,根本没有人在 tty7 上登录,并且 tty2 现在处于“非活动”状态。
  • 如果你在 tty2 登录并启动 X 服务器在同一个 tty2 上,您保留所有权限。

在大多数发行版中,startx都会做正确的事情,但使用原始 xinit 时,您可能需要手动指定vt2vt$(fgconsole)在 X 服务器参数中指定。(通常,您应该使用 startx 而不是 xinit。)

xinit xterm -- :0 vt$(fgconsole)

相关内容