Disparando uma ação quando um volume específico está conectado

10

Eu tenho uma chave USB que contém meu banco de dados de senha keepass2 e gostaria de executar algumas ações quando ele estiver conectado ao meu computador, a saber:

  • Montá-lo automaticamente em algum local específico
  • Quando a montagem é feita corretamente, iniciando keepass2 no arquivo de banco de dados de senhas

Tarefas simples, eu acho, mas não consigo encontrar como fazer isso.

Estou usando o Ubuntu 12.10 e ele monta automaticamente o dispositivo como uma "chave usb-media" e tenta abrir as imagens nele (mesmo que não haja nenhuma).

Qual é a melhor maneira de fazer isso e desativar a montagem automática do ubuntu (para que não entre em conflito)?

ereOn
fonte

Respostas:

8

Quando um novo dispositivo aparece, o udev é notificado. Normalmente, ele cria um arquivo de dispositivo com /devbase nas regras internas¹. Você pode substituir essas regras para alterar o local do arquivo do dispositivo ou executar um programa arbitrário. Aqui está uma amostra dessa regra do udev:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodine", ATTRS{serial}=="123456789", NAME="keepass/s%n", RUN+="/usr/local/sbin/keepass-drive-inserted /dev/%k%n"

A NAME=diretiva altera o local do arquivo do dispositivo, eu o incluí para fins ilustrativos, mas provavelmente não é útil para o seu caso de uso. As ATTRSregras identificam o dispositivo; execute udevinfo -a -n /dev/sdzquando a unidade estiver disponível /dev/sdzpara ver quais atributos ela possui. Lembre-se de que você só pode usar ATTRSregras de uma única seção da udevinfoentrada (além disso, você pode usar ATTRregras da seção inicial). Consulte Compreender a saída de `udevadm info -a -n / dev / sdb` para obter mais informações. Esta regra entra em um arquivo chamado algo como /etc/udev/rules.d/local-storage-keypass.rules.

Coloque os comandos que você deseja executar no script fornecido na RUNdiretiva. Algo como:

#!/bin/sh
set -e
if [ -d /media/keypass-drive ]; then
  [ "$(df -P /media/keypass-drive | awk 'NR==2 {print $1}')" = "$(df -P /media | awk 'NR==2 {print $1}')" ]
else
  mkdir /media/keypass-drive
fi
mount "$1" /media/keypass-drive
su ereon -c 'keypass2' &

Se estiver com problemas para executar um programa da GUI a partir de um script acionado no udev, consulte Posso iniciar um programa gráfico na área de trabalho de outro usuário como root?

¹ Não em sistemas modernos, onde /devestá o udevtmpfs.

Gilles 'SO- parar de ser mau'
fonte
1
Nota importante sobre isso: Ao escrever regras usando as informações de udevadm info -a -n /dev/sdX, você não pode corresponder com base em vários ancestrais. Você só pode corresponder com base nos dados do próprio dispositivo e em um único ancestral. Isso é abordado man 7 udev, mas é um pequeno comentário facilmente esquecido.
Patrick
1

A melhor maneira de fazer isso seria escrever suas próprias regras do udev para este dispositivo. Infelizmente, não posso dar dicas de como fazer isso, como nunca fiz. Portanto, a menos que alguém tenha uma resposta mais detalhada, pesquise no Google 'regras do udev' e procure exemplos em / lib / udev. Suas regras personalizadas do udev devem ser encontradas em /etc/udev/rules.d

Dennis Kaarsemaker
fonte
Obrigado pela informação. Isso pelo menos tornará minhas pesquisas mais eficientes.
ereOn