Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/08/2023, à 21: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, à 15:18)

Hors ligne

#2 Le 10/08/2023, à 21: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, à 21:51)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 10/08/2023, à 21: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, à 19:23)

Hors ligne

#4 Le 10/08/2023, à 22: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, à 22:10)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 12/08/2023, à 15: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, à 19:23)

Hors ligne

#6 Le 13/08/2023, à 10: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, à 13: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, à 19:24)

Hors ligne

#8 Le 16/08/2023, à 18: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 ? smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 16/08/2023, à 18: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à smile

Dernière modification par alrito (Le 28/10/2023, à 19:28)

Hors ligne

#10 Le 17/09/2023, à 14: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 ?

Hors ligne

#11 Le 17/09/2023, à 20: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

hmm


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#12 Le 30/09/2023, à 00: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...

Sciensous a écrit :

avec dans le scriptpourwine, mettre les export DISPLAY et XAUTHORITY qui vont

Comment on fait ??  smile

Dernière modification par alrito (Le 28/10/2023, à 19:28)

Hors ligne

#13 Le 30/09/2023, à 01: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.

alrito a écrit :

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, à 01:26)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 03/01/2024, à 22: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 sad

Hors ligne

#15 Le 04/01/2024, à 00: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 04/01/2024, à 00:50)


Archlinux sur Xiaomi Air 13

Hors ligne

#16 Le 04/01/2024, à 20: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, à 19:15)

Hors ligne

#17 Le 14/07/2024, à 19: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 smile

Hors ligne

#18 Le 14/07/2024, à 22: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... tongue

sudo apt install udevil

Le script python nommé usb_monitor.py

#!/usr/bin/env python3
import pyudev
import subprocess
import os
import time

context = 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 :

ton_script.sh a écrit :

#!/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, à 15: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, à 15:14)

Hors ligne

#20 Le 15/07/2024, à 15:18

alrito

Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique

Bonjour lynn,

Merci beaucoup, ça marche smile

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, à 15:55)

Hors ligne

#21 Le 15/07/2024, à 15: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, à 16:15)


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#22 Le 15/07/2024, à 15: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, à 16:20)

Hors ligne

#23 Le 15/07/2024, à 16: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, à 16:16)


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#24 Le 21/07/2024, à 14: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, à 15:34

alrito

Re : [Résolu] Être en tant qu'utilisateur dans une exécution automatique

Merciiiii

Ça marche trop bien !!!!!

smile big_smile cool

Hors ligne