reguła udev blokująca sesję po usunięciu klucza hid

1

Próbuję zablokować sesję po usunięciu ukrytego urządzenia, którym jest klucz HyperFIDO U2F. Jednak po wielu próbach nie odniosłem sukcesu.

Próbowałem utworzyć regułę udev /etc/udev/rules.d/50-lockscreen.rules który wygląda tak:

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

Skrypt, do którego dzwoni, lock.sh wygląda tak:

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

Czy ktoś może mi pomóc?

dkbhadeshiya
źródło

Odpowiedzi:

0

Najbardziej prawdopodobnym wyjaśnieniem jest to, że polecenie gnome-screensaver, gdy jest uruchamiane w kontekście udostępnianym przez udev, nie ma pojęcia którego wygaszacz ekranu na który wyświetlacz ma komendę - nie działa pod kontem użytkownika i nie ma zmiennych środowiskowych propagowanych podczas sesji użytkownika X.

Podejście, które może prawdopodobne być stworzonym do pracy:

  • uruchom komendę gnome-screensaver-su pod su do swojego użytkownika
  • upewnij się, że zmienna środowiskowa DISPLAY ma taką samą wartość, jaką ma w terminalu w sesji X.
  • upewnij się, że ustanowiono uprawnienia do połączenia z Twoją sesją X - będzie to wymagało manipulacji przy xauth i / lub xhost, szczegóły bardzo zależą od Twojej dokładnej konfiguracji

Aby wyjaśnić ten problem bardziej szczegółowo: X11, którego gnome używa jako infrastruktury, pozwala na scenariusze takie jak „wiele niezależnych sesji, które mogą mieć różne konta użytkowników zalogowanych, przełączanych za pomocą klawiszy funkcyjnych lub podłączonych do różnych monitorów i myszy / klawiatur „(„ Multiseat ”) i„ rzeczywista sesja działa na innym komputerze niż ta, do której podłączony jest monitor i urządzenia HID ”(„ XDMCP ”jest tutaj słowem kluczowym). „Jedna sesja, jeden użytkownik” to tak naprawdę tylko jeden możliwy przypadek użycia i jedyny, w którym polecenie zakłócające cokolwiek w takiej sesji bez bycia jego częścią, mogłoby wiedzieć, jak prawidłowo zareagować - ale nie ma specjalnych przepisów wbudowanych w tym przypadku.

rackandboneman
źródło
0

Strona podręcznika mówi:

 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.

Nie możesz tego zrobić w regule udev. Ale możesz użyć reguły udev, aby komunikować się z innym programem, który uruchamiasz podczas logowania, a następnie włączasz wygaszacz ekranu. Rozwiązuje to również problem nadawania programowi prawidłowego DISPLAY, plików cookie dotyczących uprawnień itp.

Rozwiązuje również problem tego, co powinno się stać, jeśli zalogowanych i używanych jest więcej niż jeden użytkownik (fizycznie, jeśli jest kilka ekranów lub zdalnie), ponieważ X jest wyraźnie napisany, aby na to pozwolić, nawet jeśli wiele osób nie wie i nie używaj tej funkcji.

dirkt
źródło