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 😉