Déclenchement d'une action lorsqu'un volume spécifique est connecté

10

J'ai une clé USB qui contient ma base de données de mots de passe keepass2 et j'aimerais effectuer certaines actions lorsqu'elle est branchée sur mon ordinateur, à savoir:

  • Montez-le automatiquement à un emplacement spécifique
  • Lorsque le montage est fait correctement, lancement de keepass2 sur le fichier de base de données de mots de passe

Tâches simples je suppose, mais je ne trouve pas comment faire ça.

J'utilise Ubuntu 12.10, et il monte automatiquement l'appareil comme une "clé USB multimédia" et essaie d'ouvrir les images dessus (même s'il n'y en a pas).

Quelle est la meilleure façon de le faire et de désactiver le montage automatique ubuntu (afin qu'il n'entre pas en conflit)?

ereOn
la source

Réponses:

8

Lorsqu'un nouveau périphérique apparaît, udev est averti. Il crée normalement un fichier de périphérique sous /devbasé sur des règles intégrées¹. Vous pouvez remplacer ces règles pour modifier l'emplacement du fichier de périphérique ou exécuter un programme arbitraire. Voici un exemple d'une telle règle udev:

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

La NAME=directive modifie l'emplacement du fichier de périphérique, je l'ai inclus à des fins d'illustration mais il n'est probablement pas utile pour votre cas d'utilisation. Les ATTRSrègles identifient l'appareil; exécuter udevinfo -a -n /dev/sdzlorsque le lecteur est disponible /dev/sdzpour voir quels attributs il possède. Attention, vous ne pouvez utiliser que des ATTRSrègles d'une seule section de l' udevinfoentrée (en outre, vous pouvez utiliser des ATTRrègles de la section initiale). Voir Comprendre la sortie de `udevadm info -a -n / dev / sdb` pour plus d'informations. Cette règle va dans un fichier appelé quelque chose comme /etc/udev/rules.d/local-storage-keypass.rules.

Mettez les commandes que vous souhaitez exécuter dans le script donné dans la RUNdirective. Quelque chose comme:

#!/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' &

Si vous rencontrez des problèmes pour exécuter un programme GUI à partir d'un script déclenché depuis udev, voir Puis-je lancer un programme graphique sur le bureau d'un autre utilisateur en tant que root?

¹ Pas sur les systèmes modernes où se /devtrouve sur udevtmpfs.

Gilles 'SO- arrête d'être méchant'
la source
1
Remarque importante à ce sujet: lorsque vous écrivez des règles à l'aide des informations de udevadm info -a -n /dev/sdX, vous ne pouvez pas faire de correspondance en fonction de plusieurs ancêtres. Vous ne pouvez faire de correspondance qu'en fonction des données de l'appareil lui-même et d'un seul ancêtre. C'est couvert man 7 udev, mais c'est un petit commentaire facilement ignoré.
Patrick
1

La meilleure façon de procéder serait d'écrire vos propres règles udev pour cet appareil. Malheureusement, je ne peux pas donner de conseils sur la façon de procéder, car je ne l'ai jamais fait. Donc, à moins que quelqu'un d'autre n'ait une réponse plus détaillée, recherchez les `` règles udev '' sur Google et recherchez des exemples dans / lib / udev. Vos règles udev personnalisées doivent aller dans /etc/udev/rules.d

Dennis Kaarsemaker
la source
Merci pour l'info. Cela rendra au moins mes recherches plus efficaces.
ereOn