Execute um script que exibe uma janela X de uma regra do udev

Execute um script que exibe uma janela X de uma regra do udev

Encontrei várias perguntas sobrehttp://unix.stackexchange.com& sobrehttp://stackoverflow.comrelacionado ao script de inicialização pelas regras do udev. Mas não consigo encontrar uma solução exata ou uma resposta certa para executarBashroteiro.

Então, estou fazendo a pergunta (canônica):Como executar/iniciar/executar script Bash por meio de regras do udev?

Outra coisa que encontreiEscrevendo regras do udevé:

O udev não executa esses programas em nenhum terminal ativo e não os executa no contexto de um shell. Certifique-se de garantir que seu programa esteja marcado como executável, se for um script de shell, certifique-se de que ele comece com um shebang apropriado (por exemplo, #!/bin/sh) e não espere que nenhuma saída padrão apareça em seu terminal.

Portanto, quero saber se possível que "Como executarscript bashpelas regras do udev?"


Aqui está um exemplo simples de execução do script bash.

Eu escrevi 99-myrule.rulesem /etc/udev/rules.dque contém:

ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"

Encontrei o ID do fornecedor e do produto na lsusbsaída:

$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade

E quero executar o comando experimental zenity --infoquando meu pendrive (da SanDisk listado acima) estiver conectado.

então, escrevi /home/pandya/example.sh(que é chamado RUN+=nas regras do udev) contians:

#!/bin/bash
zenity --info &
exit

Mas este script não está em execução (apesar de ter permissão de execução). Eu também tentei seguir:

  • export DISPLAY=:0no roteiro anteszenity --info
  • bash -c 'DISPLAY=:0 zenity --info

E claro:

  • sudo restart udev
  • sudo udevadm control --reload-rules

Mas não consigo obter saída zenity --info.

Por issoComo posso executar o script Bash por meio de regras do udev? Sugira-me se estiver faltando alguma coisa.

Responder1

Provavelmente, o comando está em execução, mas não sabe onde exibir a saída. Presumo que você esteja logado no X com um usuário diferente de root, e essa regra provavelmente está sendo executada como root. Experimente o seguinte comando:

su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'

Para executar qualquerScript Bashsiga o comando:

su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'

Responder2

Eu descobri recentementeum jeito elegantepara exibir tarefas GUI ou X das regras do udev sem se preocupar com DISPLAY. O princípio seria o mesmo para scripts Shell usando export.

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: se o usuário tty atual iniciar o X, caso contrário, remova-o pararaiz.

Responder3

Para qualquer outra pessoa que esteja lendo isso, a única maneira de fazer meu script no Kali Linux 2016 funcionar foi assim:

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

informação relacionada