Como executar scripts personalizados no plug-in do dispositivo USB?

37

Qual é o método de última geração para a execução automática de scripts personalizados no plug-in do dispositivo USB nas distribuições atuais do Linux como o Debian / CentOS / Fedora?

Por exemplo, se você quiser montar / copiar automaticamente alguns arquivos / desmontar um dispositivo de armazenamento em massa USB com base em seu UUID (ou ID de dispositivo, etc.).

    
por maxschlepzig 07.01.2012 / 19:27

2 respostas

24

Coloque uma linha como essa em um arquivo em /etc/udev/rules.d :

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

Adicione uma cláusula como NAME="subdir/mydisk%n" se você quiser usar um caminho de entrada personalizado em /dev .

Execute udevadm info -a -n sdb para ver com quais atributos você pode corresponder ( attribute=="value" ; substitua sdb pelo nome do dispositivo atribuído automaticamente ao disco, correspondendo à nova entrada criada em /dev quando você conectá-lo) . Observe que você pode usar cláusulas ATTRS de qualquer sub-rotina um : você pode escolher qualquer sub-rotina, mas as cláusulas ATTRS devem todas vir da mesma estância, você não pode misturar e combinar. Você pode misturar cláusulas ATTRS com outros tipos de cláusulas listadas em uma estrofe diferente.

    
por 08.01.2012 / 01:34
13

Eu olhei em /lib/udev/rules.d para exemplos de regras relacionadas a discos. Em um sistema Ubuntu, um arquivo de regras fornece a variável de ambiente ID_FS_UUID_ENC , que você pode usar em seus próprios arquivos de regras.

Assim, coloco um arquivo de regras personalizado em /etc/udev/rules.d/foodevice.rules . Como não é prefixado com um número, ele é executado pelo udev. Btw, o daemon do udev assistiu /etc/udev/rules.d para mudanças de tal forma que você não precisa reiniciá-lo nas mudanças de arquivo.

O conteúdo de /etc/udev/rules.d/foodevice.rules é:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(esta é uma regra - você tem que remover a nova linha após a cláusula ENV porque o udev não possui um mecanismo de continuação de linha)

Um programa iniciado pelo udev bloqueia o daemon - portanto, ele não deve ser executado por um longo tempo. Eu resolvi via at - por exemplo, destacando o processo fazendo o trabalho real:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
    
por 10.01.2012 / 00:16

Tags