regra udev para bloquear sessão na remoção da chave oculta

1

Estou tentando bloquear a sessão na remoção do meu dispositivo hid, que é a chave HyperFIDO U2F. No entanto, depois de tentar por muitas vezes eu não tive sucesso.

Eu tentei criar uma regra do udev em /etc/udev/rules.d/50-lockscreen.rules , que se parece com isso:

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

O script para o qual ele chama, lock.sh tem esta aparência:

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

Alguém pode me ajudar?

    
por dkbhadeshiya 07.04.2018 / 22:14

2 respostas

0

A explicação mais provável é que gnome-screensaver-command, quando executado no contexto que o udev fornece, não tem idéia de quem protetor de tela em qual display ele deve comandar - ele não está sendo executado sob sua conta de usuário e não possui as variáveis de ambiente que são propagadas por toda a sessão do usuário X.

Uma abordagem que pode provavelmente ser feita para funcionar:

  • execute gnome-screensaver-command sob um su para seu usuário
  • certifique-se de que a variável de ambiente DISPLAY esteja configurada para o mesmo valor que possui em um terminal dentro de sua sessão X
  • certifique-se de que a autoridade de conexão com sua sessão X esteja estabelecida - isso precisará de um pouco de mexer com xauth e / ou xhost, detalhes muito dependentes de sua configuração exata

Para explicar o problema com mais detalhes: o X11, que o gnome usa como infraestrutura, permite cenários como "várias sessões independentes, que podem ter contas de usuário diferentes conectadas, comutáveis por meio de teclas de função ou conectadas a diferentes monitores e mouse / teclado "(" Multiseat ") e" a sessão real está sendo executada em uma máquina diferente daquela a que o monitor e os dispositivos HID estão conectados "(" XDMCP "é a palavra-chave aqui). "Uma sessão, um usuário" é na verdade apenas um caso de uso possível, e o único em que um comando interfere em qualquer coisa em uma sessão sem fazer parte dela pode saber como reagir corretamente - mas não há provisões especiais embutidas para esse caso.

    
por 08.04.2018 / 04:53
0

A manpage diz:

 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.

Então você não pode fazer isso em uma regra do udev. Mas você pode usar uma regra do udev para se comunicar com outro programa que você inicia quando você faz o login, que então liga o protetor de tela. Isso também resolve o problema de fornecer ao programa o DISPLAY correto, cookies de autoridade, etc.

Ele também resolve o problema do que deve acontecer se mais de um usuário estiver logado e usando X (fisicamente, se houver várias telas, ou remotamente), porque X é explicitamente escrito para permitir isso, mesmo que muitas pessoas não o façam. Não conheço e não uso esse recurso.

    
por 08.04.2018 / 10:14