#1 Le 10/08/2023, à 20:31
- alrito
[Résolu] Être en tant qu'utilisateur dans une exécution automatique
Bonjour,
Mon but est d'afficher un explorateur de fichier wine se dirigeant vers mon cd ou dvd de jeu à chaque fois que j'en insert un.
Donc j'ai prévue un fichier auto.sh rangé dans "/usr/local/bin" contenant ceci :
#!/bin/bash
CDROM=~/.wine/dosdevices/i:
cd $CDROM && wine explorer i:
Puis, une régle udev appeler 99-auto.rules rangé dans "/etc/udev/rules.d" contenant ceci :
KERNEL=="sr0", ACTION=="change", RUN+="/usr/local/bin/auto.sh"
Et quand tout ça est rangé dans les dossiers prévue, que je fais les commandes suivantes :
sudo udevadm control --reload
sudo udevadm control --log-priority=debug
journalctl -f
Et bien quand j'insère un cd de jeu, je me retrouve avec ceci dans les logs
systemd-udevd[52144]: sr0: '/usr/local/bin/auto.sh'(err) '/usr/local/bin/auto.sh: line 5: cd: /root/.wine/dosdevices/i:: No such file or directory
Ça ne marche pas.
Si j"exécute le script dans un gestionnaire de fichier est ba là il fonctionne.
J'en conclu que je suis en tant que root si on voit après "line 5" :
cd : /root/....
Pourtant, je suis bien dans ma session utilisateur.
J'ai tester aussi dans la régle udev, le fameux OWNER et GROUP pour désigner un utilisateur et un groupe mais c'est pareil.
Comment on fait pour être en tant qu'utilisateur dans ce cas là ?
Dernière modification par alrito (Le 15/07/2024, à 14:18)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#2 Le 10/08/2023, à 20:51
- Watael
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
salut,
KERNEL=="sr0", ACTION=="change", RUN+="su alrito -c /usr/local/bin/auto.sh"
?
Dernière modification par Watael (Le 10/08/2023, à 20:51)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 10/08/2023, à 20:55
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Ça ne marche pas et sur les logs ça me donne ça :
systemd-udevd[55190]: sr0: Process 'su alrito -c /usr/local/bin/auto.sh' failed with exit code 1.
Dernière modification par alrito (Le 28/10/2023, à 18:23)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#4 Le 10/08/2023, à 21:09
- Watael
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
et indiquant le chemin absolu de su ?
alrito est bien ton identifiant de connexion sur ta machine, non ?
Dernière modification par Watael (Le 10/08/2023, à 21:10)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 12/08/2023, à 14:09
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Pour tout te dire, j'ai deux systèmes d'exploitations sur deux disques séparements.
L'un pour le développement (allan) et l'autre (alrito) pour l'utilisation disons propre (sans bidouille)
mais que ça soit l'un ou l'autre, le résultat est le même car j'ai tester sur les deux et avec le chemin absolu de su (/bin/su).
J'ai une suggestion quand même.
Si on le faisait passer non pas par udev mais par la barre des tâches.
Comme quand ton insère un support est qui s'affiche sur la barre des tâches (Périphérique connecter)
Comme ça je serai peut-être en tant qu'utilisateur ??
Dernière modification par alrito (Le 28/10/2023, à 18:23)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#6 Le 13/08/2023, à 09:35
- bruno
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Bonjour,
CDROM=~/.wine/dosdevices/i:
CDROM=/home/alrito/.wine/dosdevices/i:
#7 Le 13/08/2023, à 12:58
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Tu m'a donné une bonne piste en changeant le chemin dans le script mais ensuite à l'exécution, il me mais ça :
sr0: Running command "/usr/local/bin/auto.sh"
systemd-udevd[8427]: sr0: Starting '/usr/local/bin/auto.sh'
systemd-udevd[8427]: Successfully forked off '(spawn)' as PID 8438.
systemd-udevd[8427]: sr0: '/usr/local/bin/auto.sh'(err) '002c:err:virtual:try_map_free_area mmap() error Operation not permitted, range 0x100000000-0x100076000, unix_prot 0x7.'
systemd-udevd[8427]: sr0: '/usr/local/bin/auto.sh'(err) '002c:err:virtual:try_map_free_area mmap() error Operation not permitted, range 0x20000-0x96000, unix_prot 0x7.'
systemd-udevd[8427]: sr0: '/usr/local/bin/auto.sh'(err) '002c:err:virtual:try_map_free_area mmap() error Operation not permitted, range 0x7fff0000-0x80066000, unix_prot 0x7.'
systemd-udevd[8427]: sr0: '/usr/local/bin/auto.sh'(err) 'wine: failed to start L"C:\\windows\\system32\\wineboot.exe"'
systemd-udevd[8427]: sr0: '/usr/local/bin/auto.sh'(err) '0024:err:environ:run_wineboot failed to start wineboot c0000017'
systemd-udevd[8427]: sr0: '/usr/local/bin/auto.sh'(err) '0024:err:virtual:try_map_free_area mmap() error Operation not permitted, range 0x110000-0x149000, unix_prot 0x7.'
systemd-udevd[8427]: sr0: '/usr/local/bin/auto.sh'(err) 'wine: failed to load start.exe: c0000017'
systemd-udevd[8427]: sr0: Process '/usr/local/bin/auto.sh' failed with exit code 23.
systemd-udevd[8427]: sr0: Command "/usr/local/bin/auto.sh" returned 23 (error), ignoring.
Dernière modification par alrito (Le 28/10/2023, à 18:24)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#8 Le 16/08/2023, à 17:34
- Watael
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
au fait
Mon but est d'afficher un explorateur de fichier wine
mais pourquoi ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 16/08/2023, à 17:42
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Le fais d'afficher l'explorateur de fichier wine est un test.
Mon vrai but est de réaliser une exécution automatique de programme (GNU\Linux, windows) à l'insertion d'un support amovible.
Voilà
Dernière modification par alrito (Le 28/10/2023, à 18:28)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#10 Le 17/09/2023, à 13:17
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Je me demande si je peut passer par un autre processus que udev mais lequel ?
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#11 Le 17/09/2023, à 19:45
- Sciensous
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
à voir:
avec la regle udev, dans le script (lancé par root donc), faire un:
sudo -u alrito scriptpourwine
avec dans le scriptpourwine, mettre les export DISPLAY et XAUTHORITY qui vont
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
En ligne
#12 Le 29/09/2023, à 23:56
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
J'ai mis ce que tu as écris en bash dans mon script et ça ne marche pas.
En mettant un disque, on dirais qu'il bute à un endroit dans wine et il plante.
Aussi...
avec dans le scriptpourwine, mettre les export DISPLAY et XAUTHORITY qui vont
Comment on fait ??
Dernière modification par alrito (Le 28/10/2023, à 18:28)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#13 Le 30/09/2023, à 00:22
- Watael
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
udev ne s'exécute-t-il pas en tant que root ? alors, sudo est superflu, il vaut mieux directement utiliser su.
comment on fait ?
un exemple avec monCode.sh :
#!/bin/sh
maFonc() { echo "$maVar";}
maVar='foo bar' maFonc
$ ./monCode.sh
foo bar
$
ce qui fonctionne ici pour une fonction marche pour toutes les commandes; il s'agit de "variables d'environnement locales" : elles sont définies dans localement uniquement dans l'environnement de la commande précédée par la définition des variables.
Dernière modification par Watael (Le 30/09/2023, à 00:26)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 03/01/2024, à 21:39
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Meilleurs voeux à tous le monde dans la dscussion.
J'y reviens après quelque temps passer à autre chose et je me pose cette question :
Est-ce qu'on peut faire fonctionner le script en tant qu'utilisateur par un service systemd ?
Si oui, je ne sais pas comment m'y prendre
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#15 Le 03/01/2024, à 23:50
- k3c
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
pour un script systemd en tant qu'utilisateur, tu peux regarder ce que j'ai posté
(c'est du wine, d'ailleurs)
https://forum.ubuntu-fr.org/viewtopic.php?id=2082189
Dernière modification par k3c (Le 03/01/2024, à 23:50)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#16 Le 04/01/2024, à 19:45
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Bonjour k3c,
Ton poste m'a aider pour faire le fichier et j'ai procéder comme suit :
Création du fichier dans ~/.config/systemd/user/Autorun.service
[Unit]
Description=Autorun CD
[Service]
Type=forking
ExecStartPre=/opt/wine-stable/bin/wineboot -i
ExecStart=/usr/local/bin/autofs.sh
TimeoutSec=84666
[Install]
WantedBy=graphical-session.target
Puis passer la commande de prise en compte
systemctl --user enable Autorun.service
Alors maintenant, quand j'execute cette commande sur un terminal :
systemctl --user start Autorun.service
J'ai bien autofs qui démarre correctement mais là ou je voudrais que ça marche, c'est au montage de mon cdrom et là ça ne marche pas
Dernière modification par alrito (Le 14/07/2024, à 18:15)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#17 Le 14/07/2024, à 18:33
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Bonjour,
Après 7 mois environ, je suis toujours au même point.
La conclusion de j'en tire c'est que les règles udev sont reconnu que en tant qu'utilisateur "root" et même si l'on change la règle pour avoir le nom d'utilisateur que l'on veut et bien ça ne marche pas.
Même les services systemd, ça marche mais que si l'on tape sur un terminal en tant qu'utilisateur courant.
Par-contre, si l'on créer un script avec la commande systemd qui va bien, que l'on clique dessus avec la souris, pas de problème ça marche mais si on incorpore le script dans la règle udev avec "RUN", ça capote.
Je reste accrocher à une petite lueur d'espoir sur une solution mais c'est très mince.
Il faudrait que quelqu'un fasse le test pour voir si il y a quelque chose de possible.
Je jette la bouteille à la mer
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#18 Le 14/07/2024, à 21:37
- lynn
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Bonjour,
En moins de cinq minutes, voici une solution fonctionnelle proposée par une IA bien connue...
sudo apt install udevil
Le script python nommé usb_monitor.py
#!/usr/bin/env python3
import pyudev
import subprocess
import os
import timecontext = pyudev.Context()
username = os.getenv("USER")
log_file_path = f"/home/{username}/usb-autorun.log"
script_path = f"/home/{username}/launcher.sh.sh"def device_event(device):
action = device.action
if action == 'add' and 'ID_FS_TYPE' in device:
# Log the event
with open(log_file_path, 'a') as log_file:
log_file.write(f"{device.device_node} mounted\n")# Call your script
subprocess.call([script_path])monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='block')
observer = pyudev.MonitorObserver(monitor, callback=device_event, name='usb-monitor-observer')
observer.start()while True:
time.sleep(1)
La partie launcher.sh va contenir le chemin pour les logs et le nom du/des élément(s) que tu veux exécuter.
Un exemple de fichier launcher.sh qui va lancer gnome-terminal :
#!/bin/bash
# Events
echo "USB key has been inserted and the following app will start" >> $HOME/usb-autorun.log
gnome-terminal &
C'est certainement perfectible mais ça fonctionne.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#19 Le 15/07/2024, à 14:11
- soshy
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Si le service systemd fonctionne correctement, pourquoi la règle UDEV ne délenche-t-elle pas le service systemd plutôt que le script ?
A priori, il faut un truc comme ça dans la règle udev
TAG+="systemd", ENV{SYSTEMD_WANTS}="mon_super_service.service"
Dernière modification par soshy (Le 15/07/2024, à 14:14)
Hors ligne
#20 Le 15/07/2024, à 14:18
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Bonjour lynn,
Merci beaucoup, ça marche
J'ai créer un services systemd qui exécute le script directement :
[Unit]
Description=Autorun CD
[Service]
Type=forking
ExecStart=/usr/bin/python3 /home/allan/.local/lib/Kexecauto/usb_monitor.py
TimeoutSec=84666
[Install]
WantedBy=graphical-session.target
Pour l'exécutable(launcher.sh), j'ai fait comme ceci :
#!/bin/bash
wine explorer
Ensuite après avoir sauvegarder, on active le service :
$ systemctl --user enable Autorun.service
Et une fois redémarrer, ça fonctionne pour l'usb seulement mais j'espère trouver pour les cdroms.
Je pense que dans le fichier *.py, il faut juste remplacer la valeur situé dans "name='usb-monitor-observer' " mais quoi mettre ?
Enfin, je peut passer la discussion en résolu.
Dernière modification par alrito (Le 15/07/2024, à 14:55)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#21 Le 15/07/2024, à 14:42
- lynn
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Pour le cdrom, tu peux essayer avec ça : (je n'ai pas de cdrom donc je ne peux pas tester)
#!/usr/bin/env python3
import pyudev
import subprocess
import os
import time
context = pyudev.Context()
username = os.getenv("USER")
usb_log_file_path = f"/home/{username}/usb-autorun.log"
cdrom_log_file_path = f"/home/{username}/cdrom-autorun.log"
usb_script_path = f"/home/{username}/usb_launcher.sh"
cdrom_script_path = f"/home/{username}/cdrom_launcher.sh"
def device_event(device):
action = device.action
if action == 'add':
if 'ID_FS_TYPE' in device:
# Log USB event
with open(usb_log_file_path, 'a') as log_file:
log_file.write(f"{device.device_node} USB device mounted\n")
# Call USB script
subprocess.call([usb_script_path])
elif device.get('ID_CDROM_MEDIA') == '1':
# Log CD-ROM event
with open(cdrom_log_file_path, 'a') as log_file:
log_file.write(f"{device.device_node} CD-ROM inserted\n")
# Call CD-ROM script
subprocess.call([cdrom_script_path])
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='block')
observer = pyudev.MonitorObserver(monitor, callback=device_event, name='device-monitor-observer')
observer.start()
while True:
time.sleep(1)
Dernière modification par lynn (Le 15/07/2024, à 15:15)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#22 Le 15/07/2024, à 14:59
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Je viens de tester avec usb et cdrom.
L'usb fonctionne mais pas le cdrom.
Dernière modification par alrito (Le 15/07/2024, à 15:20)
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne
#23 Le 15/07/2024, à 15:03
- lynn
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
C'est modifié !
Dernière modification par lynn (Le 15/07/2024, à 15:16)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#24 Le 21/07/2024, à 13:40
- lynn
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Voici une version qui fonctionne avec USB et CDROM
#!/usr/bin/env python3
import pyudev
import subprocess
import os
import logging
import time
# Obtain path home folder
home_dir = os.path.expanduser("~")
usb_script_path = os.path.join(home_dir, "usb_launcher.sh")
cdrom_script_path = os.path.join(home_dir, "cdrom_launcher.sh")
log_file_path = os.path.join(home_dir, "device_monitor.log")
# Make sure folder exist
os.makedirs(home_dir, exist_ok=True)
# Configure logging
logging.basicConfig(filename=log_file_path, level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
context = pyudev.Context()
# Variables for event deduplication
last_cdrom_event_time = 0
cdrom_event_delay = 5 # in seconds
def device_event(device):
global last_cdrom_event_time
action = device.action
current_time = time.time()
device_node = device.device_node
if action == 'add':
if 'ID_FS_TYPE' in device:
# Log USB event
logging.info(f"USB device mounted: {device_node}")
# Call USB script
try:
result = subprocess.run([usb_script_path], capture_output=True, text=True)
if result.stdout:
logging.info(f"USB script output: {result.stdout.strip()}")
if result.stderr:
logging.error(f"USB script error: {result.stderr.strip()}")
except Exception as e:
logging.error(f"Failed to run USB script: {e}")
elif 'ID_CDROM' in device and device.get('ID_CDROM_MEDIA') == '1':
# Log CD-ROM event
logging.info(f"CD-ROM inserted: {device_node}")
# Call CD-ROM script
try:
result = subprocess.run([cdrom_script_path], capture_output=True, text=True)
if result.stdout:
logging.info(f"CD-ROM script output: {result.stdout.strip()}")
if result.stderr:
logging.error(f"CD-ROM script error: {result.stderr.strip()}")
except Exception as e:
logging.error(f"Failed to run CD-ROM script: {e}")
elif action == 'change' and 'ID_CDROM' in device and device.get('ID_CDROM_MEDIA') == '1':
# Check if the last event took place more than 'cdrom_event_delay' seconds
if current_time - last_cdrom_event_time > cdrom_event_delay:
# Log CD-ROM change event
logging.info(f"CD-ROM media changed: {device_node}")
# Call CD-ROM script
try:
result = subprocess.run([cdrom_script_path], capture_output=True, text=True)
if result.stdout:
logging.info(f"CD-ROM script output: {result.stdout.strip()}")
if result.stderr:
logging.error(f"CD-ROM script error: {result.stderr.strip()}")
except Exception as e:
logging.error(f"Failed to run CD-ROM script: {e}")
# Update last event time
last_cdrom_event_time = current_time
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='block')
observer = pyudev.MonitorObserver(monitor, callback=device_event, name='device-monitor-observer')
observer.start()
logging.info('Device monitor started')
while True:
time.sleep(1)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#25 Le 21/07/2024, à 14:34
- alrito
Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique
Merciiiii
Ça marche trop bien !!!!!
Je dirais que le secret pour résoudre un problème, c'est de la patience, parfois du recule et surtout de la prise de tête. Mais on y arrive :)
Hors ligne