udev 规则用于在删除 hid 密钥时锁定会话

udev 规则用于在删除 hid 密钥时锁定会话

我尝试在移除我的 hid 设备(即 HyperFIDO U2F 密钥)时锁定会话。但是尝试了很多次后,我还是没有成功。

我尝试创建一个/etc/udev/rules.d/50-lockscreen.rules如下所示的 udev 规则:

SUBSYSTEM="hid", ACTION=="remove", RUN+="/usr/local/bin/lock.sh"

它调用的脚本lock.sh如下所示:

#!/bin/bash
/usr/bin/gnome-screensaver-command --lock

谁能帮我?

答案1

假设您使用的是使用 systemd 的发行版。如果是这样...

看这个获取有关如何获取密钥设备信息以将其放入规则中的信息,以便它与与删除相关的特定事件(将会有多个)相匹配,然后在规则的 RUN 部分输入/usr/bin/loginctl lock-sessions。重新加载 udev 规则,拔出密钥,您的屏幕将锁定,该机器上的所有会话也将锁定。

锁定会话中,您必须找到特定的会话 ID 并锁定该 ID,但如果您拥有 root 权限,则整个计算机可能都是您的。在大多数情况下,锁定所有会话不是问题。

您已经完成。

答案2

最可能的解释是,gnome-screensaver-command 在 udev 提供的上下文中运行时,不知道谁的屏幕保护程序开启哪个显示它应该是命令 - 它不是在您的用户帐户下运行,并且它没有在您的 X 用户会话中传播的环境变量。

一种方法可以可能可以工作:

  • 以 su 身份运行 gnome-screensaver-command
  • 确保 DISPLAY 环境变量设置为与 X 会话中的终端相同的值
  • 确保已建立与 X 会话的连接权限 - 这将需要对 xauth 和/或 xhost 进行一些调整,具体细节取决于您的具体设置

更详细地解释一下这个问题:gnome 使用的 X11 是其基础架构,它允许出现以下场景:“多个独立会话,可能都登录了不同的用户帐户,可通过功能键切换或连接到不同的显示器和鼠标/键盘”(“Multiseat”)和“实际会话在与显示器和 HID 设备连接的机器不同的机器上运行”(“XDMCP”是这里的关键字)。“一个会话,一个用户”实际上只是一种可能的用例,并且是唯一一种干扰此类会话中的任何内容的命令(无需参与其中)能够知道如何正确做出反应的用例 - 但对于这种情况没有内置特殊规定。

答案3

手册页上说:

 RUN{type}
      ...
      This can only be used for very short-running foreground tasks.
      Running an event process for a long period of time may block all
      further events for this or a dependent device.

      Starting daemons or other long-running processes is not appropriate
      for udev; the forked processes, detached or not, will be
      unconditionally killed after the event handling has finished.

因此您无法在 udev 规则中执行此操作。但您可以使用 udev 规则与您登录时启动的另一个程序进行通信,然后该程序将打开屏幕保护程序。这也解决了为该程序提供正确的 DISPLAY、授权 cookie 等的问题。

它还解决了当多个用户登录并使用 X(如果有多个屏幕,则是物理上的,或者远程的)时会发生什么的问题,因为 X 明确地允许这样做,即使许多人不知道并且不使用这个特性。

相关内容