rss logo

Script Bash avec notification automatique par Email lorsqu'un périphérique USB est branché

Logo terminal Linux

Sur un système Debian GNU/Linux, j'ai travaillé sur une solution permettant de notifier les utilisateurs par email lorsqu'un disque dur externe USB était connecté. L'objectif est d'informer l'administrateur système que le disque USB est connecté avec succès.

Installation et configuration de msmtp

Voici un exemple avec ssmtp qui enverra des e-mails au relais mail.std.rocks sur le port SSL 465.

  • Installer ssmtp :
root@host:~# apt update && apt install msmtp
  • Éditer /etc/msmtprc :
account STD #Mail Server : host mail.std.rocks port 465 from backup@std.rocks #LOGIN / PASSWORD user backup@std.rocks password MyWeakPassword auth on tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt tls_certcheck off logfile /var/log/msmtp.log account default : STD

udev

udev est un gestionnaire de périphériques pour les systèmes Linux qui gère de manière dynamique les périphériques et leurs nœuds de périphériques correspondants dans le système. Il signifie "userspace device" et fonctionne dans l'espace utilisateur plutôt que dans l'espace du noyau. Il nous permettra d'exécuter un script lorsqu'un périphérique de disque USB sera connecté.

Note : supposons que le disque que nous souhaitons surveiller est /dev/sda
  • Juste pour information, nous pouvons afficher tous les attributs du périphérique /dev/sda :
root@host:~# udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/sda)
  • Créer un fichier /etc/udev/rules.d/10_usb-disk.rules :
ACTION=="add", SUBSYSTEM=="block", SUBSYSTEMS=="usb", RUN{program}+="/usr/local/sbin/mail_usb_disk.sh"
  • Recharger les règles et la configuration de udev :
root@host:~# udevadm control --reload

Script Bash

  • Créer le fichier /usr/local/sbin/mail_usb_disk.sh :
root@host:~# touch /usr/local/sbin/mail_usb_disk.sh && chmod +x /usr/local/sbin/mail_usb_disk.sh
  • Éditer le fichier /usr/local/sbin/mail_usb_disk.sh :
J'ai remarqué que le script était exécuté deux fois lors du branchement d'un périphérique USB. Pour éviter l'envoi de deux courriels, j'ai créé un fichier /tmp/udev_time et le compare avec la date actuelle. Si la différence des deux est supérieure à 10 secondes un courriel sera envoyé.
Maj 01/07/2023: Je n'ai pas testé mais certains disent que cela peut être résolu en ajoutant ENV{DEVTYPE}=="usb_device" dans la règle. #! /bin/sh MAIL_ADDRESS="backup@std.rocks" DATE=$(/bin/date "+%Y-%m-%dT%H:%M:%S") UDEV_TIME="$(/bin/date --date="$(stat /tmp/udev_time | grep Modif | sed 's/Modif.*: //')" +%s)" touch /tmp/udev_time CUR_TIME="$(/bin/date +%s)" #difference entre la date actuelle et la date de création du fichier /tmp/udev_time TIME_DIFF=$(( (CUR_TIME - UDEV_TIME) )) mailto () { LANG=C rm -f /tmp/mail_usb_disk.header echo "From: $MAIL_ADDRESS" >> /tmp/mail_usb_disk.header echo "To: $MAIL_ADDRESS" >> /tmp/mail_usb_disk.header echo "Date: "`/bin/date -R` >> /tmp/mail_usb_disk.header echo "Subject: Disk has been plugged in" >> /tmp/mail_usb_disk.header echo "Content-type: text/plain; charset=utf-8" >> /tmp/mail_usb_disk.header echo "" >> /tmp/mail_usb_disk.header echo "Disk has been plugged in" >> /tmp/mail_usb_disk.header cat /tmp/mail_usb_disk.header | /usr/bin/msmtp -f "$MAIL_ADDRESS" "$MAIL_CLIENT" rm -f /tmp/mail_usb_disk.header } #Envoyer le mail si la différence de temps est supérieure à 10 secondes if [ "$TIME_DIFF" -gt 10 ]; then mailto fi
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

contact mail address