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

17

Eu quero um script que despeja o log e começa a fazer logon assim que um armazenamento em massa USB é conectado (com o arquivo 'OKdump') e se algo anormal (como um erro visualmente presente) for detectado, eu quero faça uma captura de tela e salve-a na mesma unidade.

Amith KK
fonte

Respostas:

13

Use o Udev. O Udev é um daemon do gerenciador de dispositivos. Entre outras coisas, é responsável por nomear seus dispositivos. Você pode definir 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 está conectado.

Como resolver o seu problema:

Primeiro, você precisa coletar informações no seu dispositivo. Digamos que você o conectou e saiba que está sob o nome /dev/sdb1. Se sim, execute:

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

O comando produzirá informações sobre o seu dispositivo. É um tanto demorado. Você precisa encontrar algo que identifique o dispositivo exclusivamente. Pode ser um tipo de série ATTRS{serial}=="UA04FLGC"ou uma combinação de outros atributos, como ATTRS{idVendor}e ATTRS{idProduct}. A maioria dos nomes é mais ou menos autoexplicativa. 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 /etc/udev/rules.dque 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.rulesdevem ser uma boa opção para você. A sintaxe desse arquivo de regras pode ser muito complexa. Se você estiver interessado, pesquise no google udev. Se não, basta 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 nele. Cada linha é uma regra própria. A primeira linha executa um script para criar um dispositivo descriptografado sempre que um disco criptografado estiver conectado. A segunda linha chama o mesmo script com opções diferentes no caso de o dispositivo descriptografado ser removido. A terceira linha define permissões para outro dispositivo relacionado.

Provavelmente você precisará apenas da primeira linha. Exclua o restante e insira o número de série correto (ou a compilação dos parâmetros escolhidos para identificar o seu dispositivo).

Explicação do meu arquivo:

KERNEL=="sd?1"diz que o dispositivo que estamos procurando nesta regra é nomeado ao longo das linhas de /dev/sda1, /dev/sdc1ou algo assim. O ponto de interrogação é um curinga para qualquer letra. ATTRS{serial}=="UA04FLGC"é o identificador exclusivo aqui. Para o outro dispositivo sobre o qual eu estava falando (terceira linha), 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 à regra que ele deve agir apenas quando o dispositivo for adicionado; não quando é removido.

SYMLINK+="cusb1"cria um link simbólico para o disco para que ele seja 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.

Não vou dar mais detalhes, pois existem excelentes tutoriais sobre as regras do udev. O que você lê aqui deve ser suficiente para ser visto.

confundir
fonte
Excelente resposta, mas agora eu quero um script que faz o registro
Amith KK
4
Então você terá que escrever ou ser mais específico sobre o que exatamente você quer. Por exemplo, não vejo o que uma captura de tela diria. Também 'despeja o log do sistema' para onde? "Qualquer coisa anormal" também é um termo bastante amplo. Nós não somos o seu exército pessoal - se você sabe uma coisa ou duas sobre scripts de bash, agora você tem todas as ferramentas necessárias para escrever o script.
con-f-use
: D sorry @ con-f-use #
Amith KK