Quero iniciar automaticamente um aplicativo GUI, sempre que eu conectar um determinado dispositivo USB. Quando iniciado, o aplicativo roda em primeiro plano e não deve rodar como root.
Como posso fazer isso?
No meu caso específico, quero executar o Yubico Authenticator sempre que conectar meu token de hardware Yubikey USB FIDO2/TOTP.
Udev simples
RUN=
inadequadoUsar diretamente uma diretiva RUN em uma regra udev, como
RUN=/opt/yubico-authenticator/authenticator
não é adequado para essa finalidade.Solução para sistemas que usam systemd
A execução de um aplicativo GUI no plug-in do dispositivo pode ser obtida combinando uma regra udev com serviços de usuário systemd. Ajuste os nomes de arquivo
Description=
eExecStart=
as linhas no arquivo abaixo para suas necessidades específicas.Serviço de usuário Systemd
O serviço de usuário será executado usando suas permissões de usuário regulares, dentro do escopo da sessão atual da GUI.
~/.local/share/systemd/user/yubico-authenticator.service
que inicia o aplicativo:systemctl --user daemon-reload
systemctl --user start yubico-authenticator.service
, o que deve iniciar o aplicativo.Use udev para iniciar o serviço
Faça com que o udev inicie o serviço automaticamente no plug-in do dispositivo.
/etc/udev/rules.d/10-yubikey.rules
com o seguinte conteúdo:sudo systemctl restart udev.service
A regra acima é acionada em qualquer dispositivo USB do fornecedor 0x1050, que é Yubico. Por meio de
ENV{SYSTEMD_USER_WANTS}
, ele diz ao systemd para iniciar o serviço de usuário chamadoyubico-authenticator.service
, que deve corresponder ao nome do arquivo do arquivo de serviço criado anteriormente.Como ele diz ao systemd que o dispositivo quer que um serviço esteja em execução, e não para iniciar um executável em cada plug-in, o systemd inicia apenas uma instância no máximo. O primeiro plug-in inicia o serviço, e dispositivos subsequentes desconectam e reconectam, ou conectam vários dispositivos, não geram instâncias adicionais.