Script necessitant SSID ne fonictionne pas avant login

Bonjour,

J’ai ecrit un petit script en bash qui recupere le SSID de mon réseau via iwconfig et ecrit une resolution DNS dans etc/hosts
ce script fonctionne parfaitement lorsque je le lance manuellement
mais pas completement automatiquement lorsque je le lance avant le lancement de l’environnement graphique

voici ce que j’ai testé

1/ creer un .desktop dans .config/autostart ou /etc/xdg/autostart : fonctionne tres bien
inconveniant :

  • pas de dossier autostart dans toute les distrib (ex : LXDE)voir pas de dossier .config ex (raspberry) or je voudrais qu’il fonctionne pour le maximum de distributions
  • necessite obligatoirement un environnement graphique et je voudrais qu’ils puisse se lancer avec ET sans

2/ modifier .bashrc : fonctionne
inconveniant :

  • ne se lance pas au demarrage sauf si lancement d’un terminal ==> pas pratique

3/ modifier rc.local : ne fonctionne pas

4/ creer un script d’init : fonctionne
inconveniant :

  • script lancé mais ne reconnais pas le SSID car execute le test comme FAUX

cela me fait dire que iwconfig ne fonctionne pas avant lancement du DE
je suppose donc que l’interface wlan0 n’est pas UP avant lancement du DE
à noter que en filaire avec eth0 ce probleme n’apparait pas.
à noter également que le script d’init est bien lancé en dernier ($all)

donc question :

COMMENT RECUPERER LE SSID D’UNE INTERFACE WIFI AVANT LE LOG ?

voici le script en question :

#!/bin/bash

### BEGIN INIT INFO
# Provides:          nuage.hosts
# Required-Start:    $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Permet le loopback
# Description:       check le reseau au boot. si reconnais le reseau interne alors integre la resolution DNS dans    /etc/hosts
### END INIT INFO

SSID=$(sudo iwconfig wlan0 2> /dev/null | grep -o 'ESSID:.*' | cut -d '"' -f 2)
ETH0=$(sudo arp -a | grep eth0 | cut -d " " -f 1)

##on vide le fichier etc/hosts
#suppression des domaines existants
sudo sed -i '/#mesdomainesdebut/,/#mesdomainesfin/d' /etc/hosts
#suppression des balises existantes
sudo sed -i '/domaines/d' /etc/hosts
##on le rerempli
#mise en place des balises dans /etc/hosts
sudo echo '#mesdomainesdebut' | sudo tee --append /etc/hosts > /dev/null 
sudo echo '#mesdomainesfin' | sudo tee --append /etc/hosts > /dev/null

#connexions
if [ "$SSID" = Livebox ] || [ "$ETH0" = box.home ]; then
       sudo sed -i '/#mesdomainesdebut/ a\12.12.12.12 mon.domaine.com' /etc/hosts | sudo tee --append /etc/hosts >     /dev/null

else
       #suppression des domaines existants
       sudo sed '/#mesdomainesdebut/,/#mesdomainesfin/d' /etc/hosts > /dev/null
fi

exit

merci à vous

Peut être voir pour faire la même chose avec systemd ?
Ça m’étonnerai que l’interface réseau ne soit pas dispo avant le DE. La connexion au wifi ça par contre c’est possible.
Sinon un CRON avec un «@reboot»

Merci pour la réponse

Non cela ne fonctionne pas
je viens de tester avec CRON et systemd.
Dans les deux cas le script s’exécute bien puisqu’il écrit dans le fichier /etc/hosts mais il considère toujours le test FAUX
la variable SSID ne renvoie donc toujours pas de valeur. Cela confirme bien que le wifi n’est pas dispo avant le login.

Comment faire alors pour checker sur quel réseau on est (ou quels réseaux sont dispos) avant le login ?

merci

On ne teste pas des variables comme ça en bash, il ne faut pas faire

[ "$SSID" = Livebox ] || [ "$ETH0" = box.home ]

mais

[ "x$SSID" = "xLivebox" ] || [ "x$ETH0" = "xbox.home" ]

Si tu ne mets pas le x (ou n’importe quel autre caractère) et qu’une des variables est vide, tu as une erreur de syntaxe.

Bonjour,

Merci pour la réponse

Le script fonctionne parfaitement en fait. Manuellement ou non. C’est seulement lorsque je veut automatiser avant le login que cela pose problème. (car je pense que iwconfig renvoie une valeur vide car WiFi non dispo)
Donc Si l’erreur se situe bien au niveau du test comment se fait il qu’elle n’intervienne qu’en mode non loggué ?

Je vais tout de même corriger tout ça pour tester.

J’ai testé ça marche pareil. Le script s’exécute mais toujours pas de ssid hors session.
Comment donc récupérer les réseaux WiFi dispo (ou connectés) avant l’ouverture de session ? (graphique ou non)

Une autre piste : et si, lorsque la commande "sudo iwconfig wlan0 " est lancée la réseau est bien présent mais ce serait l’environement pour lancer cette commande qui ne serait pas bon ?
On a souvent ce cas dans une crontab.

pas du tout !
les guillemets empêchent le comportement que tu décris.
avec des guillemets, le shell sait qu’il devrait y avoir quelque chose, mais que cette chose est vide :

$ var=''
$ [ "$var" = "blah" ] && echo ok || echo ko
ko
$ [ $var = "blah" ] && echo ok || echo ko
bash: [: = : opérateur unaire attendu
ko
$ var='blah'
$ [ $var = "blah" ] && echo ok || echo ko #à ne pas faire; toujours mettre des guillemets autour des variables !
ok

pareil si la variable contient plusieurs mots, le test échouera si la variable n’est pas entre guillemets.

$ var='blah blah'
$ [ $var = "blah" ] && echo ok || echo ko
bash: [: trop d'arguments
ko

Pour les guillemets et les test j’ai corrigé tout ça maintenant.
(même si mieux écrit, il n’y a pas de changement de comportement pour autant)

Depuis j’ai testé avec d’autres commandes

iwlist scan

Et

nmcli dev wifi list 

Ces commandes réagissent de la même manière.
Elle ne fonctionnent jamais avant le lancement d’une session utilisateur mais parfaitement une fois la session lancée. Et cela que ce soit pour récupérer un ssid ou un access point ou quoique ce soit d’autre

J’ai aussi essayé de lancer via un service systemd avec network.target et même chose.

Il me semble pourtant que le system check le Wi-Fi pendant le boot . Les log dmesg font apparaître le retour de iwlwifi vers les 10sec du boot.
Mais avec la rapidité d’un ssd pas facile de savoir si c’est avant ou après le login.

Il semble donc que le Wi-Fi ai absolument besoin que la session soit ouverte avant d’être scannable
Le module WiFi ne doit pas charger avant ça je pense

Du coup si c’est bien ça je ne saisie pas bien l’intérêt du fait que la carte WiFi ne se charge pas avant le login…

Il doit bien y avoir moyen de charger le module WiFi un peu avant le login non ?

Qu’entends-tu par “environnement” ?
Tu veux dire que certaines bibliothèques ne seraient pas chargées ou inaccessibles ou inexistantes ?

merci

Parfois, un script lancé dans un terminal fonctionne et ne fonctionne pas en crontab. Ce sont des variables d’environnement tel que le PATH qui n’est pas connu dans la crontab mais chargé par l’utilisateur. Tu est peut être dans un cas tordu comme celui-ci avec une variable d’environnement initialisée après le login ?

Sinon, ce post t’aiguillera peut être :smile:

Merci pour la réponse

En fait le script fonctionne en crontab (avec une boucle infinie temporisée) en init sysV (avec boucle aussi) et aussi en service systemd (en mode Restart=60) etc…

C’est juste que la variable recherchée $SSID n’est pleine que lorsqu’une session est ouverte mais jamais avant. (ce qui nécessite des boucles infinie ou d’adapter le script en fonction du type de démarrage (graphique ou non) et de la distribution.)

Donc en soit j’ai réussi à faire ce que je voulais puisque cela fonctionne automatiquement via un service qui va relancer toute les 60sec.

Mais je me pose quand même la question du pourquoi n’est-ce pas possible d’obtenir des informations sur les réseaux WiFi avant le login… (Ce qui permettrait de ne lancer le script qu’une fois sans besoin de s’adapter outre mesure à la distribution)

Je me suis demandé si le WiFi n’était pas initialisé après login pour des raisons de sécurité peut être…? Sinon je ne vois pas bien pourquoi cela aurait été monté comme ça… (d’autant qu’il n’y à pas ce problème avec connexion filaire)

Donc si quelqu’un sait pourquoi on ne peut pas récupérer dinfo sur le WiFi avant login il est bienvenu :wink:

salut
as-tu essayé de passer par /etc/rc2.d ?

tu pourrais créer un script dans /etc/init.d/
le balancer sur les rc[1-6].d avec le démarrage au bon moment
j’essaierai si j’ai le temps

Oui oui déjà essayé et mon service systemd fonctionne en multi-user-target ce qui revient au même en fait.

Ce qu’il faut bien comprendre c’est que je n’ai aucun problème d’exécution du script…
C’est juste la variable qui ne s’écrit pas avant le login car dans ce cas elle est vide.
Après le login elle s’écrit correctement.

Après peut être est-ce lié à ma configuration donc si tu veux tester je veux bien.

Merci à toi