#1 Le 14/06/2022, à 12:48
- Vividevinci
Problème au lancement d'un script avec udev
Bonjour à tous !
Je souhaite démarrer un script au branchement d'une clé USB. Ce script lance un script Python qui permet d'analyser la clé et proposer diverses options.
Mon problème est que j'ai un message d'erreur que je ne comprends pas :
Effectivement, quand je lance un script classique (un echo dans un texte, par exemple), cela fonctionne. Quand je lance manuellement mon script qui lance mon Python, cela fonctionne également. En revanche, pas moyen de faire fonctionner en passant par la règle udev.
Voici les informations :
ma règle udev :
KERNEL=="sdb", ACTION=="add", ATTRS{serial}=="4C530000210704216231", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/station_blanche/.Xauthority", RUN+="/bin/bash -c '/usr/local/bin/script.sh'"
Evidemment, j'applique bien la commande
udevadm control --reload
après modification.
Mon script "script.sh"' :
#! /bin/bash
gnome-terminal -- bash -c " /usr/local/bin/helloworld.py;bash"
et mon script Python. Je ne sais pas si c'est très pertinent de le mettre en entier, car comme dit précédemment, il est bien fonctionnel lorsque je lance script.sh indépendamment :
#!/usr/bin/python3
# Filename :helloworld.py
# coding: utf-8
import os
from pathlib import Path
import shutil
print ('Bonjour, analyse antivirale en cours...')
prenom = input("Indiquez votre prénom :")
nom = input("Indiquez votre nom :")
print("Merci pour ces informations ! Veuillez patienter une 20aine de secondes...")
fichier = open("/home/station_blanche/Documents/logs/analyse_cache.txt","w")
fichier.write("\n\n\n-------------Nouvelle Analyse----------- \n Analyse par :" + str(prenom) + " " + str(nom) + "\n\n")
fichier.close()
os.system("clamscan -r --remove -v /media/station_blanche/Cle_Station_Blanche/ >> /home/station_blanche/Documents/logs/analyse_cache.txt")
fichier = open("/home/station_blanche/Documents/logs/analyse_cache.txt","a")
fichier.write("Analyse par :" + str(prenom) + " " + str(nom) + "\n\n\n\n")
fichier.close()
fichier = open("/home/station_blanche/Documents/logs/analyse_cache.txt","r")
donnes =fichier.read()
fichier.close()
print(donnes)
fichier = open("/home/station_blanche/Documents/logs/analyse.txt","a");
fichier.write(donnes)
fichier.close()
if os.path.exists("/home/station_blanche/Documents/Copie/Cle_Station_Blanche/MAJ/"):
print("Fichiers de mises à jour trouvés. Voulez vous mettre à jour l'antivirus ? O/N")
user_input = input()
if user_input == 'O':
if os.path.isfile("/media/station_blanche/Cle_Station_Blanche/MAJ/main.cvd"):
os.system("sudo cp /media/station_blanche/Cle_Station_Blanche/MAJ/main.cvd /var/lib/clamav")
print("Mise à jour effectuée. Copie en cours...")
if os.path.isfile("/media/station_blanche/Cle_Station_Blanche/MAJ/daily.cvd"):
os.system("sudo cp /media/station_blanche/Cle_Station_Blanche/MAJ/daily.cvd /var/lib/clamav")
print("Mise à jour effectuée. Copie en cours...")
if os.path.isfile("/media/station_blanche/Cle_Station_Blanche/MAJ/bytecode.cvd"):
os.system("sudo cp /media/station_blanche/Cle_Station_Blanche/MAJ/bytecode.cvd /var/lib/clamav")
print("Mise à jour effectuée. Copie en cours...")
else:
print("Vous faites le choix de ne pas faire les mises à jour. Copier quand même le contenu ? O/N")
user_input = input()
if user_input == 'O':
os.system("rm -r /home/station_blanche/Documents/Copie/")
shutil.copytree("/media/station_blanche/", "/home/station_blanche/Documents/Copie")
else:
print("Bien reçu. Privilégiez tout de même les mises à jour. A bientôt.")
else:
os.system("rm -r /home/station_blanche/Documents/Copie/")
shutil.copytree("/media/station_blanche/", "/home/station_blanche/Documents/Copie")
print("Copie effectué ! N'oubliez pas de débrancher proprement les deux supports")
je rajoute également le
ls -l
:
-rwxrwxrwx 1 station_blanche station_blanche 77 juin 14 11:59 script.sh
-rwxr-xr-x 1 station_blanche root 2826 juin 14 11:54 helloworld.py
Et enfin, le message d'erreur dans mon
journalctl -f
:
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: Running command "/bin/bash /usr/local/bin/script.sh"
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: Starting '/bin/bash /usr/local/bin/script.sh'
juin 14 12:01:28 stationblanche systemd-udevd[5388]: Successfully forked off '(spawn)' as PID 5407.
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: '/bin/bash /usr/local/bin/script.sh'(err) 'No protocol specified'
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: '/bin/bash /usr/local/bin/script.sh'(err) 'Unable to init server: Could not connect: Connection refused'
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: '/bin/bash /usr/local/bin/script.sh'(err) '# Failed to parse arguments: Cannot open display: '
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: Process '/bin/bash /usr/local/bin/script.sh' failed with exit code 1.
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: Command "/bin/bash /usr/local/bin/script.sh" returned 1 (error), ignoring.
juin 14 12:01:28 stationblanche systemd-udevd[5388]: sdb: Running command "/usr/bin/unshare -m /usr/bin/snap auto-import --mount=/dev/sdb"
Je ne sais plus quoi faire pour rendre ce script fonctionnel. j'ai testé pas mal de pistes, mais rien à faire. Pourriez-vous m'aider ?
Merci d'avance !
Hors ligne
#2 Le 14/06/2022, à 16:45
- Tawal
Re : Problème au lancement d'un script avec udev
Hello,
Ton script est bien lancé par la règle udev, mais il rencontre quelques soucis.
Le souci est qu'il ne peut pas se connecter au serveur X,
et la raison est que ton script est lancé en tant que root et donc les variables d'environnement telles que DISPLAY, DBUS_SESSION_BUS_ADDRESS ... ne sont pas définies.
Tu peux tenter de modifier ton script de la sorte :
#! /bin/bash
DISPLAY=:0 gnome-terminal -- bash -c " /usr/local/bin/helloworld.py;bash"
ou
#! /bin/bash
export DISPLAY=:0
gnome-terminal -- bash -c " /usr/local/bin/helloworld.py;bash"
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#3 Le 15/06/2022, à 07:47
- Vividevinci
Re : Problème au lancement d'un script avec udev
Bonjour Tawal, merci pour ta réponse.
j'ai bien modifié mon script de la sorte, mais cela ne fonctionne toujours pas.
Cependant, le message d'erreur n'est pas tout à fait le meme : il n'indique pas avoir réussi à lancer le script. En revanche, il reste avec cette erreur "1" :
sdb: Process '/bin/bash /usr/local/bin/script.sh' failed with exit code 1.
Il s'agit de la seule ligne concernant mon script dans le journalctl -f, contrairement à avant.
Merci pour ton temps !
Hors ligne
#4 Le 15/06/2022, à 11:11
- Tawal
Re : Problème au lancement d'un script avec udev
Et si tu essayais avec ce script :
#!/bin/bash
DISPLAY=:0 gnome-terminal -x "/usr/local/bin/helloworld.py; bash"
Mais j'ai bien l'impression que tu te compliques la vie.
Une règle udev qui lance un script bash qui lance un script python qui va lancer une commande système ...
Ensuite, une règle udev n'est pas forcément nécessaire, il existe déjà un gestionnaire des médias amovibles qui permet de lancer une commande à l'insertion.
Pour revenir au sujet brut, si tu as toujours une erreur, c'est ton script python qui est en cause.
Edit:
Trouvé une erreur (corrigée ici, pas dans les messages précédents) : un espace en trop dans le shebang :
#! /bin/bash ==> #!/bin/bash
Donc commencer par corriger cette erreur dans le script
Dernière modification par Tawal (Le 15/06/2022, à 11:52)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#5 Le 15/06/2022, à 15:33
- Vividevinci
Re : Problème au lancement d'un script avec udev
Merci pour tes conseils !
Malheureusement, le shebang ne semble pas être l'erreur majeure. Après de multiples tests, je constate que c'est suite à l'utilisation de "gnome-terminal" que le prgramme plante.
En effet, si j'applique "gnome-terminal" pour des usages plus basiques ( un simple echo, par exemple), j'ai le même message d'erreur.
J'aimerais creuser un petit peu plus le gestionnaire des médias amovibles ; mais, je ne trouve pas de possibilités concernant une clé USB classique. Il est majoritairement proposé des CD/ DVD... si vous avez des conseils, je suis preneur !
Si vous avez encore des pistes concernant l'exécution de mon script, ce serait très gentil, je vous en remercie d'avance
Hors ligne
#6 Le 15/06/2022, à 18:02
- Tawal
Re : Problème au lancement d'un script avec udev
N'étant pas sur Ubuntu, je ne vais pas pouvoir t'aider plus.
Attend d'autres avis.
Sorry
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne