Script de listage des clefs USB

Dans le cadre de mes délires, j’ai un gros script python qui nécessite une action de surveillance vis à vis de la présence de certaines clefs USB.

Malgré mon absence de formation de codage, j’ai réussi à écrire après quelques recherches et tâtonnement.
Je voulais vérifier la présence de certaines clefs USB selon leur nom prédéfini ET vérifier la présence d’une clef supplémentaire quelque soit son nom.

Dans cet article, vous aurez une partie simplifiée de ce script et quelques explications puisque le but est d’être didactique.

On va partir du principe que je peux avoir 2 type de clefs USB :

  • Des clefs ayant un nom spécifique (on va prendre EXEMPLE comme exemple 😀 si vous voulez bien). Il peut y avoir EXEMPLE01 et EXEMPLE02.
  • Des clefs ayant n’importe quel nom.

Tests en bash dans le Terminal en direct

Dans l’idée, on veut donc savoir si des clefs sont présentes dans /media/alban/ ce qui est facile avec ls /media/alban/ : ça liste tout ce qui est monté comme volume additionnel.
Allez-y ; il faut essayer !
(il faut remplacer /alban/ par votre propre nom d’utilisateur)

Si on veut savoir si des clefs nommées EXEMPLE01 et/ou EXEMPLE02 sont présentes, on ajoute un grep pour filtrer. Ainsi ls /media/alban/ | grep EXEMPLE* retourne uniquement les résultats contenant “EXEMPLE” en début de nom.

A l’inverse, si on veut savoir si des clefs dont le nom ne contient pas EXEMPLE sont présentes, on va taper ls /media/alban/ --ignore=EXEMPLE*

Bon, ça, c’est pour un humain lisant le Terminal. En qualité d’informaticien, il faut être fainéant et laisser la machine gérer.
On va donc jouer sur des résultats chiffrés.
Si pas de présence, le résultat est “0” ; si une clef présente, le résultat est “1” ; etc.

Il faut donc envoyer notre résultat précédent dans un système de décompte. Cela se passe avec un pipe car cela permet de rediriger la sortie du processus vers autre processus. Et ensuite, on colle un wc -l pour lister le nombre de résultat.

Petit exemple avec ls /media/alban/ --ignore=EXEMPLE* qui me renvoie “16GO” et “Données”. J’ai donc 2 résultats … mais peu exploitables.
Par contre, si je passe à la commande ls /media/alban/ --ignore=PHOTOS* | wc -l le résultat sera juste “2” ce qui est facile à exploiter avec des “if”.
En effet, je peux avoir différentes réponses secondaires : if résultat est 0 alors truc ; if résultat est 1 alors machin ; if résultat est 2 alors bidule ; …

Test en python

Il faut importer les modules os et time qui vont nous servir :
import os
import time

Il faut définir nos variables que je vais appeler Clef_EXEMPLE et Clef_Autre
Clef_EXEMPLE=int(os.popen(“ls /media/alban/ | grep EXEMPLE* | wc -l”).read())
Clef_Autre=int(os.popen(“ls /media/alban/ –ignore=EXEMPLE* | wc -l”).read())

Ensuite, on va définir des actions selon le résultat.
if Clef_EXEMPLE==2:
print(” –> Les 2 Clefs ‘EXEMPLE’ sont présentes …”)
time.sleep(1)
if Clef_EXEMPLE==1:
print(” –> Il y a qu’une clef ‘EXEMPLE’ de présente …”)
time.sleep(1)
if Clef_EXEMPLE==0:
print(” –> Oups ; zéro clef ‘EXEMPLE’ présente …”)
time.sleep(1)

Ainsi le script affichera une réponse adaptée à la situation.

Le script complet :

#!/usr/bin/python3
# -*- coding: utf-8 -*

import os
import time

Clef_EXEMPLE=int(os.popen("ls /media/alban/ | grep EXEMPLE* | wc -l").read())
Clef_Location=int(os.popen("ls /media/alban/ --ignore=EXEMPLE* | wc -l").read())

if Clef_EXEMPLE==2:
    print("--> Les 2 Clefs 'EXEMPLE' sont présentes …")
    time.sleep(1)
if Clef_EXEMPLE==1:
    print("--> Il y a qu'une clef 'EXEMPLE' de présente …")
    time.sleep(1)
if Clef_EXEMPLE==0:
    print("--> Oups ; zéro clef 'EXEMPLE' présente …")
    time.sleep(1)
    
Clef_Location=int(os.popen("ls /media/alban/ --ignore=EXEMPLE* | wc -l").read())

if Clef_Location>2:
    print("--> Il y a plus de 2 clefs présentes (hors EXEMPLE) ...")
    time.sleep(1)
if Clef_Location==2:
    print("--> Il y a 2 clefs présentes (hors EXEMPLE) ...")
    time.sleep(1)
if Clef_Location==1:
    print("--> Il y a une clef présente (hors EXEMPLE) ...")
    time.sleep(1)
if Clef_Location==0:
    print("--> Oups ; zéro clef additionnelle présente ...")
    time.sleep(1)

print("Au revoir")

Cela donne ceci :

alban@ALBAN:~$ python3 '/home/alban/Documents/test-script-verif-USB.py' 
--> Oups ; zéro clef 'EXEMPLE' présente ... 
--> Il y a plus de 2 clefs présentes (hors EXEMPLE) ...
Au revoir

Et c’est vrai que la commande ls /media/alban/ listait 16GO Données PHOTOS

On a donc 3 clefs mais pas de clef nommée EXEMPLE

On retente :

alban@ALBAN:~$ python3 '/home/alban/Documents/test-script-verif-USB.py' 
--> Il y a qu'une clef 'EXEMPLE' de présente ...
--> Il y a 2 clefs présentes (hors EXEMPLE) ...
Au revoir

Et la vérification avec ls /media/alban/ donne bien 16GO Données EXEMPLE01

Conclusion

Nous pouvons lister nos périphériques USB selon leur nom et exécuter des actions différentielles en exploitant les résultats chiffrés.
A vous de remplacer les commande “print” par des choses plus utiles ou amusantes.
Par exemple, en l’absence de la clef nommées “BACKUP”, votre système s’éteint.
Par exemple, en présence de la clef nommée “JECOPIETOUT”, votre système réalise un rsync du dossier X vers la clef.
Par exemple, en présence de la clef “007”, ça lance la prise d’une photo via la WebCam et l’envoie par courriel.
Par exemple, en présence de la clef “CAFE”, ça lance un courriel à votre chef pour qu’il vous prépare un café puisque vous avez démarré votre PC.
La seule limite, hormis votre folie sera donc votre imagination et/ou vos compétences 😉

A propos de Alban

Papa de 4 enfants étant lui-même resté un enfant. Diététicien-Nutritionniste tombé par obligation dans l'informatique à 22 ans pour le boulot et s'étant "un peu" pris au jeu ... Pas un génie de l'informatique (loin de là), mais intéressé et carrément orienté Linux et entraide. Lassé de l'évolution du Monde de la Santé dans lequel les patients sont de plus en plus à traiter comme des clients (je suis un soignant !!!), j'ai opté pour une reconversion en repartant en Alternance. D'abord dans le cadre d'un BTS SIO option SISR (Solutions d’Infrastructure, Systèmes et Réseaux) en Septembre 2019. Après l’obtention du BTS (16,57/20 ;-) ), j'ai décidé de poursuivre (toujours en alternance) en Bac+3 avec un Bachelor Concepteur de Systèmes d'Information. Citation personnelle : « Si la réussite facile flatte l’égo, C’est de la persévérance que nait le plaisir de la réussite. »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.