Como executar um script de shell quando um novo dispositivo de armazenamento USB é detectado?

17

Eu quero um script que copie o log e comece a fazer logon assim que um armazenamento em massa usb for conectado (com o arquivo 'OKdump' nele). E se algo anormal (como um erro presente visualmente) for detectado eu quero que ele tire uma captura de tela e salve-o na mesma unidade.

    
por Amith KK 24.06.2011 / 15:12

1 resposta

13

Use o Udev. O Udev é um daemon do gerenciador de dispositivos. Entre outras coisas, é responsável por nomear seus dispositivos. Você pode definir as regras do udev colocando arquivos com uma certa sintaxe no diretório de regras. As regras podem fazer muitas coisas - em particular, podem executar scripts quando um determinado dispositivo é conectado.

Como resolver seu problema:

Primeiro, você precisa coletar informações no seu dispositivo. Digamos que você o tenha conectado e saiba que ele está sob o nome /dev/sdb1 . Se assim for executado:

udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)

O comando gerará informações sobre o seu dispositivo. É um tanto demorado. Você precisa encontrar algo que identifique o dispositivo exclusivamente. Pode ser uma série como ATTRS{serial}=="UA04FLGC" ou uma combinação de outros atributos, como ATTRS{idVendor} e ATTRS{idProduct} . A maioria dos nomes é mais ou menos auto-explicativa. Escolha uma ou uma combinação de algumas que pareçam razoáveis - se elas não funcionarem, tente outra coisa.

Depois de encontrar um identificador exclusivo, crie um arquivo em /etc/udev/rules.d que comece com dois dígitos e termine com .rules . Os dois dígitos especificam a ordem de processamento desses arquivos .rules - 70-usb-log-custom.rules deve ser uma boa escolha para você. A sintaxe deste arquivo de regras pode ser muito complexa. Se você estiver interessado, acesse o google udev. Se não apenas abrir o arquivo recém-criado e editá-lo para algo parecido com isto:

# /etc/udev/rules.d/70-usb-log-custom.rules

KERNEL=="sd?1", ATTRS{serial}=="UA04FLGC", ACTION=="add", SYMLINK+="cusb1", RUN+="/home/confus/bin/usb-encrypt.sh add %k"
ENV{ID_FS_USAGE}=="crypto", ACTION=="remove", RUN+="/home/confus/bin/usb-encrypt.sh remove %k"
SUBSYSTEM=="usb", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c9f", GROUP="users", MODE="0666"

Este é um arquivo udev real que estou usando. Tem três regras. Cada linha é uma regra própria. A primeira linha executa um script para criar um dispositivo descriptografado sempre que um disco criptografado é conectado. A segunda linha chama o mesmo script com opções diferentes no evento em que o dispositivo descriptografado é removido. A terceira linha define permissões para outro dispositivo relacionado.

O mais provável é que você só precise da primeira linha. Exclua o restante e insira a serial correta (ou a combinação de parâmetros escolhidos para identificar seu dispositivo).

Explicação do meu arquivo:

KERNEL=="sd?1" diz que o dispositivo que procuramos nesta regra tem o nome ao longo das linhas de /dev/sda1 , /dev/sdc1 ou algo parecido. O questionmark é um curinga para qualquer letra. ATTRS{serial}=="UA04FLGC" é o identificador exclusivo aqui. Para o outro dispositivo que eu estava falando (terceira linha) eu não estou usando o número de série, mas uma combinação de SYSFS{idVendor}=="1781" e SYSFS{idProduct}=="0c9f" para identificá-lo.

ACTION=="add" informa a regra que deve agir somente quando o dispositivo é adicionado; não quando é removido.

SYMLINK+="cusb1" cria um link simbólico para o disco, de modo que ele será encontrado em /dev/cusb1 .

RUN+="/home/confus/bin/usb-encrypt.sh add %k" executa o script e passa 'add' e '% k' (o nome do dispositivo) para ele.

Eu não vou dar mais detalhes, pois há excelentes tutoriais sobre as regras do udev. O que você leu aqui deveria ser o suficiente para ficar com os olhos fixos.

    
por con-f-use 24.06.2011 / 18:09