
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.rules
em /etc/udev/rules.d
que contém:
ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"
Encontrei o ID do fornecedor e do produto na lsusb
saída:
$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade
E quero executar o comando experimental zenity --info
quando 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=:0
no 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!"'