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

17

Estou tentando configurar um script para ser executado toda vez que eu conecto um dispositivo USB. Eu 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, é manipulado para enviar uma notificação com o notify-send, que é instalado e funciona bem no terminal.

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

    
por JTeK 03.07.2011 / 16:07

6 respostas

6

Eu tive o mesmo problema. Isso funcionou para mim:

Tente copiar o seu script para /usr/local/bin e altere o diretório no seu arquivo .rules .

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

A linha a seguir é o conteúdo do meu arquivo .rules :

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

notify-send requer acesso ao seu barramento de sessão DBus, o que ele 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á logado ou se está logado. O multi-assento com o X11 ainda é complicado, mas a troca de usuários funciona tanto para o X11 quanto para as sessões do console. Muitas pessoas também usam SSH, VNC e NX pela rede.

    ( DISPLAY=:0 funcionaria metade do tempo, mas isso ainda é adivinhação na melhor das hipóteses.)

  • Negado pela política do DBus. Mesmo que seu script encontre a sua sessão do X11, ele não poderá enviar notificações devido ao script ser executado como root em vez da sua conta de usuário.

por 15.07.2011 / 10:10
1

Você pode tentar corresponder o dispositivo por IDs de fornecedores e produtos. 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 do lsusb ou no dmesg após conectar o dispositivo.

    
por 03.07.2011 / 17:48
1

Continuando com a resposta de Aleh: Se você também quiser monitorar remove events, precisará 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.

    
por 27.09.2013 / 15:36
0

Talvez você precise adicionar um sleep no script para dar ao dispositivo usb a chance de "se contentar"? Por exemplo, usb 3g modems, mode switching para obter um / dev / ttyUSB para ser ativado e executado pelo kernel.

    
por 06.08.2011 / 04:34
0

Tente substituir SUBSYSTEM="usb" por SUBSYSTEMS="usb"

    
por 18.06.2013 / 22:11