Script Bash avec notification automatique par Email lorsqu'un périphérique USB est branché
- Mise à jour le 01 mai 2024
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.
- Pour cela, j'ai utilisé les éléments suivants :
- udev : le gestionnaire de périphériques dynamique Linux
- msmtp : pour l'envoi des emails
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
:
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