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

10

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

  • Monte-o automaticamente em um local específico
  • Quando a montagem é feita corretamente, iniciando keepass2 no arquivo de banco de dados de senha

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 de mídia" 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)?

    
por ereOn 12.11.2012 / 10:03

2 respostas

8

Quando um novo dispositivo aparece, o udev é notificado. Normalmente cria um arquivo de dispositivo em /dev com base 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 da 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 diretiva NAME= altera o local do arquivo do dispositivo, incluí-lo para fins de ilustração, mas provavelmente não é útil para seu caso de uso. As regras ATTRS identificam o dispositivo; execute udevinfo -a -n /dev/sdz quando a unidade estiver disponível como /dev/sdz para ver quais atributos ela possui. Tenha em atenção que só pode utilizar ATTRS regras de uma única secção da udevinfo input (além disso, pode utilizar ATTR rules da secção inicial). Consulte Entenda a saída de 'udevadm info -a -n / dev / sdb ' para 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 diretiva RUN . 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 você estiver com problemas para executar um programa GUI a partir de um script acionado pelo udev, consulte Posso iniciar um programa gráfico na área de trabalho de outro usuário como root?

¹ Não em sistemas modernos em que /dev está em udevtmpfs.

    
por 13.11.2012 / 01:30
1

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

    
por 12.11.2012 / 13:25