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

41

Qual é o método mais avançado para executar automaticamente scripts personalizados no plug-in de dispositivo USB nas distribuições atuais do Linux como Debian / CentOS / Fedora?

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

maxschlepzig
fonte

Respostas:

27

Coloque uma linha como esta 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ê deseja usar um caminho de entrada personalizado em /dev.

Execute udevadm info -a -n sdbpara ver com quais atributos você pode comparar ( attribute=="value"; substitua sdbpelo nome do dispositivo atribuído automaticamente ao disco, correspondente à nova entrada criada /devquando você o conecta). Note que você pode usar ATTRScláusulas de qualquer uma estrofe: você pode escolher qualquer estrofe, mas as ATTRScláusulas devem todos vêm da mesma estrofe, você não pode misturar e combinar. Você pode misturar ATTRScláusulas com outros tipos de cláusulas listadas em uma estrofe diferente.

Gilles 'SO- parar de ser mau'
fonte
11
Esta resposta ainda é válida? Sob nenhuma quantidade de mexerico posso obter o script para executar (e tocar em um arquivo). Se você puder fornecer o exemplo mais básico que executa um script quando algo estiver conectado, isso seria ótimo e podemos trabalhar a partir daí.
Redsandro 22/02
@Redsandro Eu tenho variações dessa regra na minha configuração do udev e elas estão funcionando. Você conectou e conectou o dispositivo ou executou udevadm trigger? Seu sistema usa o udev? Se você deseja executar um script quando algo estiver conectado, remova todas as condições (as cláusulas com ==) (talvez a sintaxe exija uma condição, não tenho certeza; se isso acontecer, use KERNEL=="*").
Gilles 'SO- stop be evil'
Eu tentei isso também, mas, como funciona para você, devo estar perdendo um passo. Tenho mudou essa questão aqui , para que eu possa escrever exemplo de código.
Redsandro 22/02
Talvez relacionado, acho que há um prazo para quanto tempo o script pode ser executado. Eu acredito que é muito curto (como 1 segundo ou algo assim). Se demorar mais do que isso, o udev o matará. Você pode contornar isso usando o script em segundo plano com algo parecido at. Veja "executando programas externos" em reactivated.net/writing_udev_rules.html
cheshirekow
Só para acrescentar a isto, por uma questão de exaustividade, as necessidades de arquivo para ter o sufixo .rulese os arquivos no diretório são lidos em uma ordem lexical (convenção usa prefixo numérico para encomendá-los), e eles podem ser abaixo /etc/, /usr/libou /run. Para mais, RTFM .
starfry
14

Procurei /lib/udev/rules.dexemplos de regras relacionadas ao disco. Em um sistema Ubuntu, um arquivo de regra fornece a variável de ambiente ID_FS_UUID_ENCque você pode usar em seus próprios arquivos de regra.

Assim, coloquei um arquivo de regras personalizado /etc/udev/rules.d/foodevice.rules. Como não é prefixado com um número, ele é finalmente executado pelo udev. Aliás, o daemon udev observou /etc/udev/rules.dalterações, de modo que você não precisa reiniciá-lo nas alterações 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ê deve 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, não deve ser executado por um longo tempo. Eu resolvi isso via at- ou seja, via desanexação do processo realizando o trabalho real:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
maxschlepzig
fonte
11
Pode ser necessário recarregar as regras do udev usando udevadm control --reload-rules, dependendo da sua distribuição.
user44038
11
Em vez de at nowsugerir batch.
Reintegrar Monica - M. Schröder
O que fazer quando você não tem nem atnem batch? Estou em um ambiente incorporado com o busybox .
Natelho 27/04
@natenho, você pode usar ~/path/mountcopystuff.sh &- atetc. tem a vantagem de receber notificações por e-mail caso algo dê errado - mas em um sistema incorporado isso provavelmente não é de grande interesse.
maxschlepzig