O UDEV pode, de alguma forma, ativar o zenity de um usuário logado em uma sessão?

0

Eu gostaria que um pop-up de diálogo zenity perguntasse se gostaria de executar um backup quando eu conectei uma unidade externa específica.

Infelizmente, estou tendo problemas com a sintaxe da regra UDEV. Eu tenho essa regra em /etc/udev/rules.d/test.rules :

ACTION=="add", ATTRS{manufacturer}=="Western Digital", ATTRS{idVendor}=="1058", ATTRS{idProduct}=="1140", RUN+="/usr/local/bin/test.sh"

É bem básico, mas:

  1. É acionado uma dúzia de vezes em vez de uma vez.
  2. Ele não pode 'falar' usando zenity quando test.sh for sudo -Hu <username> zenity --warning --text="Just some random text for now." porque o udev está escondido no sistema e não pode encontrar o gerenciador de janelas: Gtk-WARNING **: não é possível abrir a exibição:
  3. Não é muito fácil de editar, gostaria que houvesse algum tipo de regra em que eu pudesse digitar o LABEL para determinadas partições nas quais gostaria de acionar determinados scripts.

Eu gostaria de ver uma melhoria geral para a regra da UDEV, porque além das muitas perguntas e respostas sobre isso, aqui e em outros lugares, elas parecem um pouco diferentes umas das outras e a maioria delas dispara várias vezes.

Mas o mais importante, como, de alguma forma, posso fazer a conexão daqui para um script em minha casa que tenha acesso a coisas como minha sessão e minha tela para que zenity possa funcionar?

    
por Redsandro 14.04.2013 / 18:52

2 respostas

0

Você já encontrou a resposta. O script (zenity) precisa de um X Window Server para exibir uma mensagem. O script é executado a partir de udev e não possui exibição anexada a ele. Você pode resolver isso instalando a variável DISPLAY em seu script, ou seja,

DISPLAY=:0; export DISPLAY

A desvantagem disso é que ele funciona apenas se você for o único usuário e / ou conhecer a exibição antecipadamente. Se houver vários usuários em seu sistema, a exibição pode ser qualquer outra coisa, por exemplo, :1 , :2 e assim por diante. Ou outro usuário recebe a mensagem zenity na tela dele.

Uma abordagem melhor seria dividir a detecção do evento e a interação com o usuário ou a exibição da mensagem.

Para isso, você pode criar um script ou programa, que é executado em sua sessão da GUI e escuta um acionador de um daemon ou do script do acionador do udev.

Uma terceira possibilidade poderia ser conectar-se ao udisks-daemon e solicitar informações, quando o dispositivo externo estiver conectado. Você pode tentar udisks --monitor ou udisks --monitor-detail para isso e analise a saída, sempre que um evento acontecer.

Parece haver um comando udisksctl , que faz o mesmo com um pouco sintaxe diferente. Talvez seja apenas uma versão mais recente do comando udisks .

Você também pode ver algumas ferramentas do Gui, como Discos do GNOME , que também contam com o sistema udev / udisks.

Atualizar :

As invocações múltiplas geralmente surgem do relatório dos vários subsistemas. Você pode ver que, ao registrar o ambiente em algum arquivo de log no script /usr/local/bin/test.sh

umask 077
mkdir -p /tmp/udevtest.d
env >>/tmp/udevtest.d/udevtest.log

Quando eu plugo um pendrive, recebo os seguintes relatórios

$ grep -e ACTION -e SUBSYSTEM /tmp/udevtest.d/udevtest.log
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_host
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_disk
ACTION=add
SUBSYSTEM=scsi_generic
ACTION=add
SUBSYSTEM=scsi_device
ACTION=add
SUBSYSTEM=bsg
ACTION=add
SUBSYSTEM=block
ACTION=add
SUBSYSTEM=block

Você também pode adicionar DEVTYPE para distinguir entre os dois relatórios usb ou disk . Portanto, para reduzir os relatórios a apenas algumas ou mesmo apenas uma, você deve ser mais específico e adicionar condições adicionais ao seu arquivo de regras do udev, por exemplo, escolha SUBSYSTEM=scsi_disk ou o que for apropriado para o seu dispositivo.

    
por 16.04.2013 / 12:44
0

Para qualquer um que tenha lido isso, a única maneira que consegui fazer com que meu script no Kali Linux 2016 funcionasse, foi assim:

#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'
    
por 10.10.2016 / 00:01