Usando regras do udev para executar um script na inserção USB


17

Estou tentando configurar um script para ser executado sempre que conectar um dispositivo USB. Criei o arquivo /etc/udev/rules.d/90-local.rules e adicionei a seguinte regra:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

O problema é que, quando a unidade está conectada, nada acontece. O script, para fins de depuração, é projetado para enviar uma notificação com o notify-send, que está instalado e funciona bem no terminal.

O caminho para o script está correto, pois executei o comando exato no terminal sem problemas.


Seu antivírus está em execução? Esse é um comportamento que desencadeia ações de qualquer número de programas AV. Embora eu esperasse um aviso, se você desativou as notificações, talvez não o veja, exceto nos logs. Eu recomendaria desabilitar a Internet, depois o seu programa AV, e tentar novamente.
Zenbike 03/07

Executando o Ubuntu 11.04 sem AV instalado.
JTeK

@zenbike: Por que adicionar regras personalizadas do udev acionaria um programa antivírus?
user1686

Iniciar qualquer script na inserção do dispositivo pode causar falsos positivos em um conjunto de antivírus para verificar dispositivos removíveis. Eu não sei. Isso aconteceu comigo com um script instalado de fábrica em um pendrive e com o Avira AV, eu sei.
Zenbike

Respostas:


6

Eu tive o mesmo problema. Isso funcionou para mim:

Tente copiar seu script /usr/local/bine alterar o diretório em seu .rulesarquivo.

Além disso, não sei o que é SYSFS, mas eu preferiria usar as propriedades ATTR.

A seguinte linha é o conteúdo do meu .rulesarquivo:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"

a ATTRS{vendor}=="SanDisk "parte isso significa que apenas Sandiskserá detectado?
precisa saber é o seguinte

7

notify-send requer acesso ao seu barramento de sessão DBus, que não pode ter por dois motivos:

  • Nenhuma informação sobre a sessão. Quando iniciado pelo udev, seu script não sabe nada sobre onde você está conectado ou se está conectado. Multi-assento com o X11 ainda é complicado, mas a troca de usuário funciona para as sessões do X11 e do console. Muitas pessoas também usam SSH, VNC e NX na rede.

    ( DISPLAY=:0Iria trabalhar metade do tempo, mas que ainda está supondo que na melhor das hipóteses).

  • Negado pela política DBus. Mesmo que seu script encontre sua sessão X11 de alguma forma, ele não poderá enviar notificações devido à execução do script como em rootvez da sua conta de usuário.


2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;fez o truque para mim com notificar-send
MLT

1

Você pode tentar corresponder o dispositivo por IDs de fornecedor e produto. A seguinte regra personalizada funciona para mim:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

Você pode ver idVendor e idProduct na saída lsusb ou dmesg após conectar o dispositivo.


Eu tentei isso e também não funcionou ... (ATTR {idProduct} == "5530") ... o fornecedor também é necessário? Acho que não ...
JTeK

Nesse caso, o problema pode estar no próprio script. Por exemplo, pode depender da variável env $ PATH. Para um teste, tente executá-lo como export PATH = ''; /home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

Seguindo a resposta de Aleh: Se você também deseja monitorar removeeventos, precisa procurar uma variável de ambiente chamada ID_SERIAL. Ele contém o fornecedor e o ID do produto separados por sublinhado:

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

A regra agora é mais curta também.


0

Talvez você precise adicionar um sleepno script, para dar ao dispositivo USB a chance de "se acalmar"? Por exemplo, modems usb 3G, alternância de modo para obter um / dev / ttyUSB para ser iniciado e executado pelo kernel.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.