[Linux] Exécution au démarrage d'un script sh dans un tty

Antoine Delaporte adlp@::1
Mar 22 Juil 16:02:30 CEST 2025


De : Daniel Huhardeaux
> Envoyé : mardi 22 juillet 2025 à 2:49 PM UTC+2

> Bonjour,
> 
> soit le script
On dirait un énonce du Bac :-)

> #!/bin/sh
> 
> $(which wayfire)
> export WAYLAND_DISPLAY=wayland-1
> $(which wayvnc) fd99:1234:beef:cafe::19
> 
> exit 0
> 
> à exécuter au démarrage de l'ordinateur pour un utilisateur Z. Lorsqu'il 
> est exécuter à partir d'un tty auquel est connecté l'utilisateur Z il 
> est fonctionnel.
Donc il n'est pas à exécuter au démarrage de l'ordinateur, car
l'utilisateur n'est pas loggué.
Et quand bien même, il y a de l'auto-logon, ca n'est pas au démarrage de 
l'ordi, mais bien au login de l'user


> Je cherche à présent à le faire exécuter au démarrage de l'ordinateur et 
> ça coince. Les tests sont effectués en étant connecté en ssh à cet 
> ordinateur: je me fais jeter par /dev/dri/render128 lorsque wayfire se 
> lance, les droits étant root:render u=rw g=rw o=
> 
> Question: pourquoi le même utilisateur peut l'exécuter en terminal et 
> pas via ssh?
En fait, il y a des var d'env qui permettent de faire le lien avec 
l'environnement graphique


> J'ai créé un service systemctl --user: il n'est même pas exécuté !
L'as-tu enabled ? oui la question est con... mais je ne te cacherais pas 
que je l'ai déjà faite celle-là...


> La configuration: Mac mini M2 sous Asahi Linux Debian 13, X11 n'est plus 
> suivi (par Debian ou Debian Asahi Linux, je ne sais) donc passage à 
> Wayland. Et pour utiliser VNC bein ... c'est la galère, pas de gestion 
> directe avec wayland, faut passer par les  compositors.
> 
> Si une bonne idée venait à germer auprès de vous qui ne savez que faire 
> puisque tout est calme au boulot ou vous êtes en vacances et vous vous 
> ennuyez ;), je serai preneur.

Bon voici un bout de code (avec lequel je jouais avant-hier ;)) qui 
pourrait t'aider...
Je ne vais pas te cacher que l'objectif de ce code de test est d'envoyer 
un popup sur l'ordi de quelqu'un de proche, via un crontab.

L'idée de ce code est de
   * Récupérer l'user loggué
   * Récupérer si on est en X11/wayland
   * afficher une popup a la con, voire un popup questionneur (si tu as 
zenity)

Oui ce code ne passera pas partout (en gros qu'un seul user loggé), etc..



=====
#!/bin/bash

# 🔍 Détection de l'utilisateur graphique actif
USER=$(loginctl list-users | awk '$1 ~ /^[0-9]+$/ { print $2 }' | while 
read u; do
   SESSION=$(loginctl list-sessions | grep "$u" | awk '{print $1}')
   for s in $SESSION; do
     TYPE=$(loginctl show-session "$s" -p Type | cut -d= -f2)
     if [[ "$TYPE" == "x11" || "$TYPE" == "wayland" ]]; then
       echo "$u"
       break
     fi
   done
done | head -n1)

if [[ -z "$USER" ]]; then
   echo "❌ Aucun utilisateur graphique détecté"
   exit 1
fi

UID=$(id -u "$USER")
DISPLAY=$(pgrep -u "$UID" -a X | grep -o ":[0-9]" | head -n1)
DISPLAY=${DISPLAY:-:0}
XAUTHORITY="/home/$USER/.Xauthority"
DBUS_SESSION="/run/user/$UID/bus"

echo "✅ Utilisateur graphique : $USER"
echo "🖼️  DISPLAY : $DISPLAY"

# 🔔 Envoi d’une notification
sudo -u "$USER" DISPLAY="$DISPLAY" 
DBUS_SESSION_BUS_ADDRESS="unix:path=$DBUS_SESSION" \
   notify-send "🔔 Action requise" "Coucou $USER, choisis une option..."

# 📋 Boîte de dialogue avec boutons
CHOIX=$(sudo -u "$USER" DISPLAY="$DISPLAY" XAUTHORITY="$XAUTHORITY" \
   zenity --question \
          --title="Assistant système" \
          --text="Souhaites-tu lancer une sauvegarde ?" \
          --ok-label="Oui, je sauvegarde !" \
          --cancel-label="Non, plus tard" \
   && echo "OK" || echo "CANCEL")

# 🔍 Action selon le choix
if [[ "$CHOIX" == "OK" ]]; then
   logger "L'utilisateur $USER a choisi de lancer la sauvegarde"
   # /usr/local/bin/mon-script-de-sauvegarde.sh
else
   logger "L'utilisateur $USER a repoussé la sauvegarde"
fi


=====

> Bonne journée
> -- 
> 



Plus d'informations sur la liste de diffusion linux